使用Stacks实现Queue(JAVA)时遇到错误

时间:2016-03-05 01:44:14

标签: java

当我使用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();
    }
}
}

非常感谢!

3 个答案:

答案 0 :(得分:2)

问题是,在for循环中,您增加i,同时s1.size()正在减少。想象一下s1在开头有5个元素。

  1. 迭代:i = 0,s1.size() = 5
  2. 迭代:i = 1,s1.size() = 4
  3. 迭代:i = 2,s1.size() = 3
  4. 迭代:i = 3,s1.size() = 2
  5. 循环将停止,因为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.由于断开条件为sizei < 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)的堆栈。那么这些是is1.size()的值以及每次迭代开始时的堆栈元素本身:

i s1.size() stack
0         4 1,2,3,4
1         3 1,2,3
2         2 1,2 // here the loop stops