牛客网刷题|用两个栈实现队列

牛客网第七题:

编程链接:
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

用一个栈专门来完成push操作;
用另一个栈来完成pop操作,如果这个栈为空,那么就把第一个栈的元素依次出栈然后入栈到该栈,由于元素在第一个栈中是先入后出,经过转移的步骤,元素就变成了先入先出了,满足队列的性质。

解题:
首先得清楚栈和队列的基本概念,栈是先进后出,队列是先进先出。
栈就是前面是封死的,进去了还得退出来。
而队列就是排队,排的越早,出去的也越早。

所以要用栈实现队列,考虑的就是一个栈用来专门push数据,另一个专门pop数据。

看代码:

class Solution
{
public:
    void push(int node) {
       stack1.push(node);       //将stack1作为输入栈 
    }

    int pop() {
        if(stack2.empty())//如果输出栈是空的,则需要把输入栈的数据放进输出栈。
        {
            while(!stack1.empty())  //把输入栈的所有数据全部放入输出栈,则刚好反向
            {
                stack2.push(stack1.top());
                stack1.pop();               
            }        
        }
        int ret = stack2.top();  //之后输出输出栈的第一个即可
        stack2.pop();
        return ret;      
    }

private:
    stack<int> stack1;
    stack<int> stack2;
};

那么,如何用两个队列实现一个栈呢?

两个队列中始终保持一个队列永远为空;
push操作:把元素入不为空的那个队列;
pop操作:由于一个队列为空,于是把不为空的那个队列的元素出队到为空的这个队列,直到不为空的队列只剩一个元素为止,这个时候把这个元素弹出队列返回,这样就又保证了两个队列中保持一个队列永远为空。

要用队列实现,栈,就需要来回倒腾。
从一个队列,放到另一个空队列里,再输出即可。
代码如下:

class Solution
{
public:
    void push(int node) {
        que1.empty() ? que2.push(node) : que1.push(node); //谁空,不放谁
    }

    int pop() {
        auto &que_out = que1.empty() ? que2 : que1;   //空的是输出队列,另一个是输入队列。
        auto &que_in = que1.empty() ? que1 : que2;
        while (que_out.size() > 1)  //输出的只剩一个
            que_in.push(que_out.front()), que_out.pop();
        int ret = que_out.front();  //把最后一个返回即可
        que_out.pop();
        return ret;
    }

private:
    queue<int> que1;
    queue<int> que2;
};

你可能感兴趣的:(刷题-从零开刷)