我有一个非常基本的问题
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()
是否随堆栈大小的变化而变化?
答案 0 :(得分:6)
条件
i < s.size()
是否随堆栈大小的变化而变化?
是的,因为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();
...
}
答案 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(" ->");
}