方法一:双栈模拟队列

1.结题思路

模拟题,首先根据栈和队列的特性,栈是先进后出,队列是先进先出,不难得知,将数组元素按1,2,3顺序压入栈后,出栈顺序为3,2,1,改变了一次元素先后顺序,而将元素再压入栈后,出栈顺序即与第一次入栈时相同,实现了先入先出。

2.解法

入栈:栈1入栈即为模拟入队。
出栈:栈1在栈2为空的时候,将栈1内元素全部依次出栈再入栈栈2,再出栈2栈顶元素即为出队;在栈2非空的时候,则直接出栈。

3.图解

图片说明

4.具体代码

class Solution
{
public:
    void push(int node) {
        stack1.push(node);//用栈1入栈模拟队列入队 
    }

    int pop() {
        if(!stack2.empty()){//栈2有元素则直接出栈 
            int ans=stack2.top();
            stack2.pop();
            return ans; 
        }else{//否则将栈1元素出队到栈2,再让栈2顶元素出栈 
            while(!stack1.empty()){
                int temp=stack1.top();
                stack1.pop();
                stack2.push(temp);
            } 
            int ans=stack2.top();
            stack2.pop();
            return ans;
        }
    }

private:
    stack<int> stack1;//栈1模拟入队操作 
    stack<int> stack2;//栈2模拟出队操作 
};

5.时间复杂度和空间复杂度分析

时间复杂度:O(1),每个元素最多出入栈1栈2各一次,出入栈操作均为O(1)
空间复杂度:O(n),n是模拟队列中的元素个数,用到了栈来存放n个数