题解 | #由两个栈组成的队列#

由两个栈组成的队列

http://www.nowcoder.com/practice/6bc058b32ee54a5fa18c62f29bae9863

#include<bits/stdc++.h>
using namespace std;
class MyQueue{
    public:
    stack<int>s1;
    stack<int>s2;
    MyQueue(){}
    void add(int);
    void poll();
    int peek();
};
void MyQueue::add(int val)
{
    if(!s2.empty()){
        while(!s2.empty()){
            s1.push(s2.top());
            s2.pop();
        }
    }
    s1.push(val);
}
void MyQueue::poll()
{
    while(!s1.empty()){
        s2.push(s1.top());
        s1.pop();
    }
    s2.pop();
    while(!s2.empty()){
        s1.push(s2.top());
        s2.pop();
    }
}
int MyQueue::peek()
{
    if(!s2.empty()){
        return s2.top();
    }else{
        while(!s1.empty()){
            s2.push(s1.top());
            s1.pop();
        }
        return s2.top();
    }
}
int main()
{
    int n;
    cin>>n;
    string op;
    int val;
    MyQueue q;
    while(cin>>op){
        if(op=="add"){
            cin>>val;
            q.add(val);
        }else if(op=="poll"){
            q.poll();
        }else if(op=="peek"){
            cout<<q.peek()<<endl;
        }
    }
    return 0;
}


栈是FILO而队列是FIFO,栈底就是队头,因此需要两个栈S1和S2,将S1按顺序压入S2,S2的栈顶就是队头。因此add操作需要判断S2是否为空,不为空就需要将S2倒腾回S1,再进行操作,就是在队尾进行压入;poll 和 peek也是同理,需要进行倒腾。

全部评论

相关推荐

投递长鑫存储等公司8个岗位
点赞 评论 收藏
分享
自学java狠狠赚一...:骗你点star的,港卵公司,记得把star收回去
点赞 评论 收藏
分享
醉蟀:你不干有的是人干
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 18:22
投了几百份简历,专业和方向完全对口,都已读不回。尝试改了一下学校,果然有奇效。
steelhead:这不是很正常嘛,BOSS好的是即便是你学院本可能都会和聊几句,牛客上学院本机会很少了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务