解题思路

用两个栈实现队列。 1.一个栈用作输入栈,一个栈用作输出栈。 2.输入数据时,直接压入第一个栈。 3.需要输出数据时,直接将第一个栈的数据全部按栈输出顺序挪到第二个栈中,输出第二个栈的栈顶即可。之后直到栈二再次为空,否则不进行栈一数据的移动。 alt

代码

class MyQueue {
public:
    MyQueue() {

    }
    
    void push(int x) {
        stack1.push(x);//输入栈
    }
    
    int pop() {
        //如果输出栈为空,将输入栈的数据全部移过去
        if(stack2.size()==0){
            while(stack1.size()!=0){
                stack2.push(stack1.top());
                stack1.pop();
            }
            //输出并删除栈顶元素
            int a = stack2.top();
            stack2.pop();
            return a;
        }
        int a = stack2.top();
        stack2.pop();
        return a;
    }
    
    int peek() {
        if(stack2.size()==0){
            while(stack1.size()!=0){
                stack2.push(stack1.top());
                stack1.pop();
            }
            return stack2.top();
        }
        return stack2.top();;
    }
    
    bool empty() {
        return stack1.size()==0 && stack2.size()==0;
    }

private:
    stack<int> stack1;//输入栈
    stack<int> stack2;//输出栈
};

复杂度分析

时间复杂度: O(1)。对于单个数据来说,时间复杂度并不为O(1),有可能是O(n),n为队列中元素个数。但是对于存取n个数据的操作过程来说,单个数据的均摊复杂度就是O(1)。

空间复杂度: O(n)。n为队列元素个数。