为什么 Java.Util.Stack 不弹出循环中的最后一个元素?

Why does the Java.Util.Stack not pop last element in the loop?

我有一个非常基本的问题

Stack<Integer> s=new Stack<integer>();
s.push(New Integer(1));
s.push(New Integer(2));
s.push(New Integer(3));
for(int i=0;i<s.size();i++){
                System.out.println("i: "+i+" size:"+s.size());
                System.out.print(s.pop());
                if(s.size()>=1)
                    System.out.print(" ->");
 }

这导致输出

3->2->

而不是

3->2->1

不应该循环运行三次,条件i < s.size()是否随着堆栈大小的变化而变化?

Is the condition i < s.size() changing as the stack size changes ?

是的,因为 i 增加同时 size() 减少。遍历脑海中或纸上的逻辑。

for ( i = 0, size = 3 )
    pop() ... i++

for ( i = 1, size = 2 )
    pop() ... i++

for ( i = 2, size = 1 )
    loop ends

我们通常会这样写这样一个循环:

while (!s.isEmpty()) {
    Integer e = s.pop();
    ...
}

是的,正如您所说,循环根据堆栈大小检查 i 的值。由于堆栈大小在变化,它不会做你想做的事。只需将初始堆栈大小放入变量:

Stack<Integer> s=new Stack<integer>();
s.push(New Integer(1));
s.push(New Integer(2));
s.push(New Integer(3));
int size = s.size()
for(int i=0;i<size;i++){
                System.out.println("i: "+i+" size:"+s.size());
                System.out.print(s.pop());
                if(s.size()>=1)
                    System.out.print(" ->");
 }