为什么我不能从堆栈添加所有节点


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=0stack.size()=10,下一次比较i=1stack.size()=9,依此类推。当i=5stack.size()=5时停止。在循环之前设置length=stack.size();length固定为10,而不考虑将来对stack.size()的更改。

最新更新