[LeetCode] 232. Implement Queue using Stacks

232. Implement Queue using Stacks (用两个栈实现一个队列)



1. 题目翻译

使用两个栈完成一个队列的下列功能

  • push(x) – 将x加入队尾。
  • pop() – 移除队列头部的元素。
  • peek() – 返回队列头部的元素。
  • empty() – 如果队列为空返回true。

注意:

  • 只能使用标准的栈操作–包括push,peek,pop,size和empty。
  • 假设所有操作都是有效的(即不存在对空队列的pop和peek操作)。

2. 解题方法

假设我们将元素{1},{2},{3}按序加入队列中,我们可以先按序将这些元素加入栈s1中,这样是没问题的,因为加入栈和队列保持相同的顺序。

但是,当我们要移执行pop的时候,在栈中最先被移除的永远是最后加入的元素,而队列正好相反。所以需要使用两个栈让它们保持相同的顺序。我们需要将s1中的所有元素移入到栈s2中,这时s2中的元素顺序为{3},{2},{1}(1为栈顶),从s2中移出栈顶{1}就相当于移出队列头部。peek操作与pop操作是一样的只不过不用删除s2栈顶只是返回就可以(注意:每次完成后,s1和s2最多只能有一个栈中存在数据,所以当要pop和peek时如果s1非空,则要把s1中元素移动到s2中)。

对于push操作,我们需要在s1中操作,这样才能加入到队尾。同样,操作前需要判断s2如果是非空,需要将s2中的所有数据移动到s1中在进行操作。

3. 代码

//Runtime: 0ms
class MyQueue {
private:
    stack<int> s1;
    stack<int> s2;
public:
    /** Initialize your data structure here. */
    MyQueue() {

    }

    /** Push element x to the back of queue. */
    void push(int x) {
        while(!s2.empty()){
            s1.push(s2.top());
            s2.pop();
        }  
        s1.push(x);
    }

    /** Removes the element from in front of queue and returns that element. */
    int pop() {
        int front = 0;
        if(!s1.empty()){
            while(!s1.empty()){
                s2.push(s1.top());
                s1.pop();
            }

            if(!s2.empty()){
                front = s2.top();
                s2.pop();
            }   
        }else if(!s2.empty()){
            front = s2.top();
            s2.pop();
        }


        return front;

    }

    /** Get the front element. */
    int peek() {
        int front = 0;
        if(!s1.empty()){
            while(!s1.empty()){
                s2.push(s1.top());
                s1.pop();
            }

            if(!s2.empty()){
                front = s2.top();
            }   
        }else if(!s2.empty()){
            front = s2.top();
        }


        return front;
    }

    /** Returns whether the queue is empty. */
    bool empty() {
        return s1.empty()&&s2.empty();
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值