使用两个堆栈实现队列

时间:2013-12-03 01:22:15

标签: java stack queue

我认为我的代码是正确的,但我不知道它为什么不在堆栈中添加元素。 我应该在main中创建其他两个堆栈吗?

import java.util.Stack;

public class stacks {
    public Stack<Integer> in = new Stack<Integer>();
    public Stack<Integer> out = new Stack<Integer>();

    public void enqueue(int value){
         in.push(value);
    }
    public int dequeue(){
         if (out.isEmpty()){
            while(!in.isEmpty()){
                out.push(in.pop());
            }
        }
        return out.pop();
    }
    public static void main(String[] args) {


        in.enqueue(10);
        in.enqueue(49);


    }

}

2 个答案:

答案 0 :(得分:0)

这里的问题是你试图制作一个静态引用(从主要的)到非静态的东西。

进行以下更改:

public static int dequeue()

public static void enqueue(int value)

对此的解决方法是创建面向对象的堆栈队列类,然后在单独的类中创建该堆栈队列类的实例。这将消除任何静态参考问题,并使您的程序与当今常见的面向对象编程标准相提并论。像这样:

import java.util.Stack;

public class stacksTest {
    public Stack<Integer> in = new Stack<Integer>();
    public Stack<Integer> out = new Stack<Integer>();

    public void enqueue(int value){
         in.push(value);
    }
    public int dequeue(){
         if (out.isEmpty()){
            while(!in.isEmpty()){
                out.push(in.pop());
            }
        }
        return out.pop();
    }
}

然后创建一个新类:

public class Test {
public static void main(String[] args) {
    stackTest st = new stackTest();
    st.enqueue(10);
    st.dequeue(10);        
}
}

答案 1 :(得分:0)

您的代码绝对正确。你错过了一件小事。

您在stack 1期间推送enqueue中的元素。 在dequeue期间,您正在弹出stack 1中的元素并推送stack 2。然后你弹出stack 2的顶部元素。

(1)。 你缺少的东西是。从堆栈2中弹回所有元素并将它们推送到堆栈1.因此,我建议您这样做:

public int dequeue(){
         if (out.isEmpty())
         {
          while(!in.isEmpty())
            {
                out.push(in.pop());
            }
          }
        int outVar = out.pop();
        while(!out.isEmpty())
            {
                in.push(out.pop());
            }
         return outVar;
    }

(2)。在主要方法。您不必创建两个不同的堆栈。您只需要创建类Stacks的对象。这将解决目的。

public static void main(String[] args) {

        Stacks obj = new Stacks();
        obj.enqueue(10); // Would enqueue 10 in the Stack 1 of the Object 'obj'
        obj.enqueue(49);

        System.out.println(obj.dequeue());// Would display the dequeued element. 


    }

希望这有帮助。