当我使用Stacks来实现Queue时,我遇到了一个奇怪的问题。谁能给我一个想法? 当我像这样编写代码时,这是错误的。因为如果我创建一个MyQueue的对象,然后按(1)push(2)pop,它将返回1.但它应该是2.
class MyQueue {
Stack<Integer> s1=new Stack<Integer>();
Stack<Integer> s2=new Stack<Integer>();
// Push element x to the back of queue.
public void push(int x) {
s1.push(x);
}
// Removes the element from in front of queue.
public void pop() {
if(s2.size()!=0)
s2.pop();
else{
for(int i = 0; i<s1.size(); i++){
s2.push(s1.pop());
}
s2.pop();
}
}
}
但如果我修改下面的代码,那是正确的,但我找不到这两个类之间的区别。
class MyQueue {
Stack<Integer> s1=new Stack<Integer>();
Stack<Integer> s2=new Stack<Integer>();
// Push element x to the back of queue.
public void push(int x) {
s1.push(x);
}
// Removes the element from in front of queue.
public void pop() {
if(!s2.empty())
s2.pop();
else{
while(!s1.empty())
s2.push(s1.pop());
s2.pop();
}
}
}
非常感谢!
答案 0 :(得分:2)
问题是,在for
循环中,您增加i
,同时s1.size()
正在减少。想象一下s1
在开头有5个元素。
i
= 0,s1.size()
= 5 i
= 1,s1.size()
= 4 i
= 2,s1.size()
= 3 i
= 3,s1.size()
= 2 循环将停止,因为i < s1.size()
现在是false
,即使s1
中仍有元素。
答案 1 :(得分:1)
第一个例子中的问题是for
循环:
for(int i = 0; i<s1.size(); i++){
s2.push(s1.pop());
}
一旦我们推出两个元素,假设size
的{{1}}为2。现在,在第一次迭代之后,从s1
弹出一个元素,因此s1
变为1.由于断开条件为size
(i < s1.size()
在第一次迭代后为1),它突破了循环,一个元素留在了s1。
第二个例子使用while循环,因此不会出现这种情况。
另外,我建议将i
方法的返回类型更改为pop
。
答案 2 :(得分:1)
此
for(int i = 0; i<s1.size(); i++){
s2.push(s1.pop());
}
不等于
while(!s1.empty())
s2.push(s1.pop());
请注意s1.size()
每次迭代都会发生变化,因此在所有元素从s1
中弹出之前,您将最终终止循环。例如,假设您有一个包含4个元素(1,2,3和4)的堆栈。那么这些是i
,s1.size()
的值以及每次迭代开始时的堆栈元素本身:
i s1.size() stack
0 4 1,2,3,4
1 3 1,2,3
2 2 1,2 // here the loop stops