现在的位置: 首页 > 综合 > 正文

OfferKiller 两个栈实现一个队列

2018年04月04日 ⁄ 综合 ⁄ 共 743字 ⁄ 字号 评论关闭

题目链接:Click here~~

题意:

RT。

解题思路:

竟然没一眼秒掉,还是不够自信,不过细想一下还是想出来了,记录一下吧。。。

直接模拟一个过程,应该就能发现如何操作了。设两个栈分别为 s1 和 s2。

举个例子,首先队列 push 了 3 个值 {1,2,3},我们也按照顺序将其 push 到栈 s1 中。

此时如果队列要取 front 了,则需要访问 s1 栈底的元素,但其他元素不能直接扔掉,一会还要留着用,这时就把他们按出栈顺序 {3,2} 扔到栈 s2 中。

而以这个顺序入栈后,对应的出栈顺序正好和出队顺序一致,即 “反反得正”,所以我们不妨保留这个栈,出队时,先考虑这个栈即可。

#include <stdio.h>
#include <stack>

using std::stack;

class MyQueue
{
    private:
        stack<int> storage,buffer;
    public:
        void push(int x)
        {
            storage.push(x);
        }
        int pop()
        {
            if(!buffer.empty())
            {
                int ret = buffer.top();
                buffer.pop();
                return ret;
            }
            else
            {
                if(storage.empty())
                    return -1;
                while(!storage.empty())
                {
                    buffer.push(storage.top());
                    storage.pop();
                }
                return pop();
            }
        }
}q;

int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        char op[3];
        int x;
        scanf("%s",op);
        if(op[1] == 'U')
        {
            scanf("%d",&x);
            q.push(x);
        }
        else
            printf("%d\n",q.pop());
    }
    return 0;
}

抱歉!评论已关闭.