用栈实现队列

题目简述:用两个栈实现队列

题目链接
我的思路:
初始化两个栈s1,s2
push操作:将元素压入栈1。
pop操作:先将栈1的所有数据压入栈2,再从栈2进行pop,之后再将栈2的数据压回栈1。
peek操作:与pop操作类似,先将栈1的所有数据压入栈2,再读取栈2顶的元素,之后再将栈2的数据压回栈1。

class MyQueue {
public:
   /** Initialize your data structure here. */
   MyQueue() {

   }
   
   /** Push element x to the back of queue. */
   void push(int x) {
       s1.push(x);
   }
   
   /** Removes the element from in front of queue and returns that element. */
   int pop() {
       while(!s1.empty())
       {
           s2.push(s1.top());
           s1.pop();
       }
       int val = s2.top();
       s2.pop();
       while(!s2.empty())
       {
           s1.push(s2.top());
           s2.pop();
       }
       return val;
   }
   
   /** Get the front element. */
   int peek() {
       while(!s1.empty())
       {
           s2.push(s1.top());
           s1.pop();
       }
       auto val = s2.top();
       while(!s2.empty())
       {
           s1.push(s2.top());
           s2.pop();
       }
       return val;
   }
   
   /** Returns whether the queue is empty. */
   bool empty() {
       if(s1.empty())
           return true;
       else
           return false; 

   }
   stack<int> s1;
   stack<int> s2;
};

/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue* obj = new MyQueue();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->peek();
* bool param_4 = obj->empty();
*/

但其实大可不必每次执行完pop和peek操作后再把栈2的数据全部又压回栈1,而是每次要执行pop和peek操作之前先判断栈2是否为空,如果为空则把栈1的所有数据压入栈2,否则直接对栈2进行相关操作即可!!!

class MyQueue {
public:
    stack<int> stIn;
    stack<int> stOut;
    /** Initialize your data structure here. */
    MyQueue() {

    }
    /** Push element x to the back of queue. */
    void push(int x) {
        stIn.push(x);
    }

    /** Removes the element from in front of queue and returns that element. */
    int pop() {
        // 只有当stOut为空的时候,再从stIn里导入数据(导入stIn全部数据)
        if (stOut.empty()) {
            // 从stIn导入数据直到stIn为空
            while(!stIn.empty()) {
                stOut.push(stIn.top());
                stIn.pop();
            }
        }
        int result = stOut.top();
        stOut.pop();
        return result;
    }

    /** Get the front element. */
    int peek() {
        int res = this->pop(); // 直接使用已有的pop函数
        stOut.push(res); // 因为pop函数弹出了元素res,所以再添加回去
        return res;
    }

    /** Returns whether the queue is empty. */
    bool empty() {
        return stIn.empty() && stOut.empty();
    }
};

上述代码来源于公众号:代码随想录
其中peek实现方式也很巧妙:直接利用了已经实现好的pop操作!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值