LeetCode第 232 题:用栈实现队列(C++)

    技术2024-08-13  70

    232. 用栈实现队列 - 力扣(LeetCode)

    重点在于栈是先进后出,队列是先进先出的。要是pop()和peek()操作对象是最先进的那个元素,就得改变栈里面元素的顺序,简单来说就是逆序,自然想到两个栈倒腾:

    入队 - O(1) 出队 - 摊还复杂度 O(1)

    class MyQueue { public: MyQueue() { } void push(int x) { in_stk.push(x); } int pop() { int a; if(out_stk.empty()){ while(!in_stk.empty()){ out_stk.push(in_stk.top()); in_stk.pop(); } a = out_stk.top(); out_stk.pop(); }else{ a = out_stk.top(); out_stk.pop(); } return a; } int peek() { if(out_stk.empty()){ while(!in_stk.empty()){ out_stk.push(in_stk.top()); in_stk.pop(); } } return out_stk.top(); } bool empty() { return in_stk.empty() && out_stk.empty(); } private: stack<int> in_stk; stack<int> out_stk; };

    换个写法:

    入队 - O(n) 出队 - O(1)

    class MyQueue { public: MyQueue() { } void push(int x) { while(!in_stk.empty()){ out_stk.push(in_stk.top()); in_stk.pop(); } out_stk.push(x); while(!out_stk.empty()){ in_stk.push(out_stk.top()); out_stk.pop(); } } int pop() { int a = in_stk.top(); in_stk.pop(); return a; } int peek() { return in_stk.top(); } bool empty() { return in_stk.empty(); } private: stack<int> in_stk; stack<int> out_stk; };
    Processed: 0.013, SQL: 9