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

为什么Java.Util.Stack不会弹出循环中的最后一个元素?,java,collections,stack,Java,Collections,Stack,我有一个非常基本的问题 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()); Syst

我有一个非常基本的问题

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(" ->");
 }
Stack s=新堆栈();
s、 push(新整数(1));
s、 push(新整数(2));
s、 push(新整数(3));
对于(int i=0;i=1)
系统输出打印(“->”);
}
这将导致输出为

3->2->

而不是

3->2->1

循环不应该运行三次吗?条件
i
是否随着堆栈大小的变化而变化

条件
i
是否随着堆栈大小的变化而变化

是的,因为
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(" ->");
 }
Stack s=新堆栈();
s、 push(新整数(1));
s、 push(新整数(2));
s、 push(新整数(3));
int size=s.size()
对于(int i=0;i=1)
系统输出打印(“->”);
}

如果
size()
要返回堆栈的大小:它不是一定会随着堆栈大小的变化而变化吗?读你的问题,自己回答!您可以添加一些内容来显示如何在不参考
size()
的情况下打印
->