zoukankan      html  css  js  c++  java
  • [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();
        }
    };



  • 相关阅读:
    c语言中的隐式函数声明(转)
    static关键字
    Eclipse中spring项目的XML文件的问题
    spring 中c3p0的优化配置
    Mysql通过SQL脚本复制表
    tomcat 设置内存
    删除无限循环的文件夹-删除递归文件夹
    使用cnpm代替npm
    数据库框架的log4j日志配置
    Win7删除远程连接历史记录
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5347779.html
Copyright © 2011-2022 走看看