[LeetCode]Implement Stack using Queues

Implement the following operations of a stack using queues.

  • push(x) -- Push element x onto stack.
  • pop() -- Removes the element on top of the stack.
  • top() -- Get the top element.
  • empty() -- Return whether the stack is empty.
Notes:
  • You may assume that all operations are valid (for example, no pop or top operations will be called on an empty stack).
  • Depending on your language, queue may not be supported natively. You may simulate a queue by using a list or deque (double-ended queue), as long as you use only standard operations of a queue -- which means only push to backpop from frontsize, and is empty operations are valid.

Update (2015-06-11):
The class name of the Java function had been updated to MyStack instead of Stack.

Credits:

Special thanks to @jianchao.li.fighter for adding this problem and all test cases.

[LeetCode]

两种实现方法

1)两个队列,当取栈顶时,把全部元素进到还有一个队列,然后最后出队列的就是栈顶。pop的操作也是类似的,注意两个队列之间的转换。

2)一个队列,记录队列此时的长度n,出队列第n次的元素就是栈顶元素。

我们能够把出队列的元素再次入队列,这样就能够用一个队列实现。

同理用两个栈实现队列也是类似的做法。

两个队列实现:

class Stack {
private:
    queue<int>temp[2];
    int cur = 0;
public:
    // Push element x onto stack.
    void push(int x) {
        temp[cur].push(x);
    }

    // Removes the element on top of the stack.
    void pop(void) {
        while(temp[cur].size()>1){
            int n = temp[cur].front();
            temp[cur].pop();
            temp[1-cur].push(n);
        }
        temp[cur].pop();
        cur = 1-cur;
    }

    // Get the top element.
    int top(void) {
         while(temp[cur].size()>1){
            int n = temp[cur].front();
            temp[cur].pop();
            temp[1-cur].push(n);
        }
        int ret = temp[cur].front();
        temp[cur].pop();
        temp[1-cur].push(ret);
        cur = 1- cur;
        return ret;
    }

    // Return whether the stack is empty.
    bool empty(void) {
        return temp[cur].empty();
    }
};
一个队列实现:

class Stack {
private:
    queue<int>temp;
public:
    // Push element x onto stack.
    void push(int x) {
        temp.push(x);
    }

    // Removes the element on top of the stack.
    void pop(void) {
       int len = temp.size();
       while(len>1){
           int n = temp.front();
           temp.pop();
           temp.push(n);
           len -- ;
       }
       temp.pop();
    }

    // Get the top element.
    int top(void) {
        int len = temp.size();
        while(len>1){
            int n = temp.front();
            temp.pop();
            temp.push(n);
            len -- ;
        }
        int ret = temp.front();
        temp.pop();
        temp.push(ret);
        return ret;
    }

    // Return whether the stack is empty.
    bool empty(void) {
        return temp.empty();
    }
};



posted @ 2016-04-02 16:39  lcchuguo  阅读(182)  评论(0编辑  收藏  举报