225.Implement Stack using Queues

用队列实现栈的功能。
MyStack stack = new MyStack();

stack.push(1);
stack.push(2);
stack.top(); // returns 2
stack.pop(); // returns 2
stack.empty(); // returns false

思路:关键在于队列是先进先出,而栈是后进先出,所以他们的顺序是反着的,解决办法就是,每一次push一个数据 x 到队列时,就循环的将队列中位于 x 前面的数拿出来,再放入到 队列尾部去,让 x 处于队列的头部。其余的 top( ) , pop( ) ,empty( ) 就直接利用队列的属性即可。

class MyStack {
private:
    queue<int> q1;
public:
    void push(int x) {
        q1.push(x);
        for (int i = 0; i < q1.size() - 1; i++) {
            q1.push(q1.front());
            q1.pop();
        }
    }
    int pop() {
        int x = q1.front();
        q1.pop();
        return x;
    }
    int top() {
        return q1.front();
    }
    bool empty() {
        return q1.empty();
    }
};

 

 

Java 版:

class MyStack {
    Queue<Integer> queue1;
    Queue<Integer> queue2;//运用两个队列
    public MyStack() {
        queue1 = new LinkedList<>();
        queue2 = new LinkedList<>();//初始化
    }
    
    public void push(int x) {
        if(queue2.size() == 0) queue2.add(x);
        else{ //使用queue2 一直保存栈顶元素
            queue1.add(queue2.remove());
            queue2.add(x);
        }
    }
    
    public int pop() {
        int res;
        if(queue2.size() == 1) res = queue2.remove();
        else{ //栈顶元素存在于 queue2 中,则直接获取;否则,从 queue1 中获取
            while(queue1.size() > 1){
                queue2.add(queue1.remove());
            }
            res = queue1.remove();
            Queue<Integer> tmp = queue1;
            queue1 = queue2; //queue1 为空后,交换 queue1 、queue2 的位置
            queue2 = tmp;
        }
        return res;
    }
    
    public int top() {
        int res = pop();
        push(res); //先 pop 获取栈顶元素,再 push 存入
        return res;
    }
    
    public boolean empty() {
        return queue1.isEmpty() && queue2.isEmpty();
    }
}

 

posted @ 2020-05-11 22:23  星海寻梦233  阅读(124)  评论(0编辑  收藏  举报