为什么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()
的情况下打印->
。