user-0 提问: C语言  判断栈为空的函数

回复:
user: user-1
content: 引用 9 楼 super_admi 的回复:其实这是一个哲学问题。 任何问题首先是一个哲学问题。不是吗？ 参考： 《黑客帝国》完全解析_知识库_博客园 《黑客帝国》里的锡安是不是虚拟世界_知识库_博客园

user: user-2
content: 其实这是一个哲学问题。

user: user-3
content: 引用 5 楼 ri_aje 的回复:[quote=引用 2 楼 TheBigBangWOW 的回复:] [quote=引用 1 楼 ri_aje 的回复:] 答案是正确的。你说的那种方法，对付不了以下情况。  Stack* s = new stack; s->pTop = null; isempty(s);   谢谢，以你的代码来看，是不是就是说，新建一个栈s，然后s->ptop=null之后，这时候s不是null，但是s->ptop是null， 所以如果isempty只有判断s的话，这时候isempty就会返回true，但是实际上栈是空的    [/quote] 对。其实 isempty 里面实际上判断两件事， 1. 指针 s 有意义。这时候才能问 s 指向的栈对象是否为空，因为这个问题存在的前提是 s 首先得指向一个有效的对象。这就是 s != NULL 的作用。 2. 已知 s 一定指向一个有效的栈对象，问是否该对象表述的栈为空。这就是 s->pTop != NULL 的作用。  其实如果你不用指针，那么第一个问题就消失了。比如下面的 c++ 代码使用引用，则该对象一定有效，也就没有判断的必要了。  bool isempty (S const& stack) {  return stack.pTop != nullptr; } [/quote] 五楼的说法比较正确，如果你要判断一个栈是否为空， 1、首先你得保证这个栈是一个能用的栈，这时就用到了S!=NULL. 2、S!=NULL了说明栈是一个可以使用的栈，然后在判断S->top栈的第一个值是不是空。 就比如说，你面前摆了一个杯子，你说他是空的还不是空的？ 你要说他是空的，里面还有空气呢。 一个栈里的元素已经是NULL了，你硬要说他不是空的谁也没办法不是。

user: user-0
content: 引用 8 楼 galiniur0u 的回复:[quote=引用 5 楼 ri_aje 的回复:] [quote=引用 2 楼 TheBigBangWOW 的回复:] [quote=引用 1 楼 ri_aje 的回复:] 答案是正确的。你说的那种方法，对付不了以下情况。  Stack* s = new stack; s->pTop = null; isempty(s);   谢谢，以你的代码来看，是不是就是说，新建一个栈s，然后s->ptop=null之后，这时候s不是null，但是s->ptop是null， 所以如果isempty只有判断s的话，这时候isempty就会返回true，但是实际上栈是空的    [/quote] 对。其实 isempty 里面实际上判断两件事， 1. 指针 s 有意义。这时候才能问 s 指向的栈对象是否为空，因为这个问题存在的前提是 s 首先得指向一个有效的对象。这就是 s != NULL 的作用。 2. 已知 s 一定指向一个有效的栈对象，问是否该对象表述的栈为空。这就是 s->pTop != NULL 的作用。  其实如果你不用指针，那么第一个问题就消失了。比如下面的 c++ 代码使用引用，则该对象一定有效，也就没有判断的必要了。  bool isempty (S const& stack) {  return stack.pTop != nullptr; } [/quote] 五楼的说法比较正确，如果你要判断一个栈是否为空， 1、首先你得保证这个栈是一个能用的栈，这时就用到了S!=NULL. 2、S!=NULL了说明栈是一个可以使用的栈，然后在判断S->top栈的第一个值是不是空。 就比如说，你面前摆了一个杯子，你说他是空的还不是空的？ 你要说他是空的，里面还有空气呢。 一个栈里的元素已经是NULL了，你硬要说他不是空的谁也没办法不是。[/quote]   谢谢，你举得杯子这个例子比较好，跟这题很类似

user: user-0
content: 引用 6 楼 smallnat 的回复:顶4# 很好学。。。一个问题发两次。。这边我就没兴趣说很多了~~加油！ 谢谢

user: user-4
content: 顶4# 很好学。。。一个问题发两次。。这边我就没兴趣说很多了~~加油！

user: user-5
content: 引用 2 楼 TheBigBangWOW 的回复:[quote=引用 1 楼 ri_aje 的回复:] 答案是正确的。你说的那种方法，对付不了以下情况。  Stack* s = new stack; s->pTop = null; isempty(s);   谢谢，以你的代码来看，是不是就是说，新建一个栈s，然后s->ptop=null之后，这时候s不是null，但是s->ptop是null， 所以如果isempty只有判断s的话，这时候isempty就会返回true，但是实际上栈是空的    [/quote] 对。其实 isempty 里面实际上判断两件事， 1. 指针 s 有意义。这时候才能问 s 指向的栈对象是否为空，因为这个问题存在的前提是 s 首先得指向一个有效的对象。这就是 s != NULL 的作用。 2. 已知 s 一定指向一个有效的栈对象，问是否该对象表述的栈为空。这就是 s->pTop != NULL 的作用。  其实如果你不用指针，那么第一个问题就消失了。比如下面的 c++ 代码使用引用，则该对象一定有效，也就没有判断的必要了。  bool isempty (S const& stack) {  return stack.pTop != nullptr; }

user: user-0
content: 引用 3 楼 user-6 的回复:s为null意思是说还没有创建 -> s指向null ptop指向为空，毕竟s还是有内容的 -> s指向ptop，ptop指向null  是啊，所以我认为即使s->ptop==null，但是s里面还有个ptop，所以这时候s不是空栈，所以判断条件不应该是s==null || s->ptop==null， 因为想我说的情况， 如果s里面有ptop，即便s->ptops==null 但是S也不是空的，因为S里面有ptop 不知道我这样理解对不对

user: user-6
content: s为null意思是说还没有创建 -> s指向null ptop指向为空，毕竟s还是有内容的 -> s指向ptop，ptop指向null

user: user-0
content: 引用 1 楼 ri_aje 的回复:答案是正确的。你说的那种方法，对付不了以下情况。  Stack* s = new stack; s->pTop = null; isempty(s);   谢谢，以你的代码来看，是不是就是说，新建一个栈s，然后s->ptop=null之后，这时候s不是null，但是s->ptop是null， 所以如果isempty只有判断s的话，这时候isempty就会返回true，但是实际上栈是空的

user: user-5
content: 答案是正确的。你说的那种方法，对付不了以下情况。  Stack* s = new stack; s->pTop = null; isempty(s);