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

时间:2015-06-11 13:58:16

标签: 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());
                System.out.print(s.pop());
                if(s.size()>=1)
                    System.out.print(" ->");
 }

这导致输出

  

3→2→

而不是

  

3→2→1

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

2 个答案:

答案 0 :(得分:6)

  

条件i < s.size()是否随堆栈大小的变化而变化?

是的,因为isize()减少的同时增加了。通过头脑或纸上的逻辑来理解。

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();
    ...
}

答案 1 :(得分:1)

是的,就像你说的那样,循环会根据堆栈大小检查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(" ->");
 }