一.题意整理

用两个栈来实现一个队列,分别完成在队列尾部插入整数(push)和在队列头部删除整数(pop)的功能。队列 中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。

二.思路整理 图片说明

c++STL中的stack可以直接拿过来用,下面介绍一下STL中stack的用法:

push(x)将x入栈,时间复杂度为O(1)
top()获得栈顶元素,时间复杂度为O(1)
pop()用以弹出栈顶元素,时间复杂度为O(1)
empty()可以检测stack内是否为空,放回true为空,返回false为非空,时间复杂度为O(1)
size()返回stack内元素的个数,时间复杂度为O(1)

首先我们知道了栈的特点就是先进后出,我们就要了解队列这种数据结构。队列是一种先进先出的数据结构,我们可以利用两个栈来实现这种数据结构,一个栈用来实现入队列,一个栈用来实现出队列,一种“负负得正”的感觉。当一个栈全为空时,将另一个站的全部元素都放到该栈中,然后该栈元素全部出栈,进而实现了先进先出的队列了。

三.代码实现

class Solution
{
public:
    void push(int node) {
        stack1.push(node);
    }
    int pop() {
        //当stack2全为空时,stack1全部到stack2 然后stack2再出栈(模拟出队列)
        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;//出队列
};

时间复杂度:O(1)O(1) 利用STL,效率很高

空间复杂度:O(n)O(n) 需要利用栈来存储