Stack<Node> stack = new Stack<>();
for (int i = 0; i < 10; i++) {
stack.push(new Node(i));
}
当我尝试时:
while(stack != null){
double_list.add_tail(stack.pop());}
它向我抛出EmptyStackException
当我尝试这个:
for (int i = 0; i < stack.size(); i++) {
double_list.add_tail(stack.pop());
}
它不会打印出所有节点(只有一半(
第一个例子是错误的,因为您将stack
引用与null
进行比较,但您的意思是检查其大小:
// Wrong
while(stack != null){
double_list.add_tail(stack.pop());
}
// Right
while(stack.size() > 0) {
double_list.add_tail(stack.pop());
}
这是因为即使堆栈为空,对空结构的引用仍然存在,并且不是null
。
第二个例子是错误的,因为你从循环中的堆栈中弹出,所以它的大小正在缩小:
// Wrong
for (int i = 0; i < stack.size(); i++) {
double_list.add_tail(stack.pop());
}
// Right
int length = stack.size();
for (int i = 0; i < length; i++) {
double_list.add_tail(stack.pop());
}
如果没有此更改,stack.size()
将在pop()
之后求值,因此它将小一个元素。同时,i
递增。第一次迭代比较i=0
和stack.size()=10
,下一次比较i=1
和stack.size()=9
,依此类推。当i=5
和stack.size()=5
时停止。在循环之前设置length=stack.size();
将length
固定为10
,而不考虑将来对stack.size()
的更改。