232用栈实现队列(使用两个栈模拟队列的两头)

    技术2022-07-11  131

    1、题目描述

    使用栈实现队列的下列操作:

    push(x) -- 将一个元素放入队列的尾部。 pop() -- 从队列首部移除元素。 peek() -- 返回队列首部的元素。 empty() -- 返回队列是否为空。

    说明:

    你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。

    2、示例

    MyQueue queue = new MyQueue();

    queue.push(1); queue.push(2);   queue.peek();  // 返回 1 queue.pop();   // 返回 1 queue.empty(); // 返回 false

    3、题解

    解法一:

    基本思想:使用两个栈,入队O(n),出队O(1)。当栈push新进来一个元素val,则将栈里原来的所有元素依次出栈,val入栈,重新依次入栈,这样就使得新元素val位于栈底了而且原来元素顺序不变。

    解法二:

    基本思想:使用两个栈,入队O(1),出队O(1)。相当于模拟队列的两头一个栈模拟入队一头,一个栈模拟出队一头。

    #include<iostream> #include<stack> #include<algorithm> #include<vector> using namespace std; class MyQueue { public: /** Initialize your data structure here. */ MyQueue() { //基本思想:使用两个栈,入队O(n),出队O(1) //当栈push新进来一个元素val,则将栈里原来的所有元素依次出栈,val入栈,重新依次入栈,这样就使得新元素val位于栈底了而且原来元素顺序不变 } /** Push element x to the back of queue. */ void push(int x) { stack<int> st_temp; while (!st.empty()) { int temp = st.top(); st.pop(); st_temp.push(temp); } st.push(x); while (!st_temp.empty()) { int temp = st_temp.top(); st_temp.pop(); st.push(temp); } } /** Removes the element from in front of queue and returns that element. */ int pop() { int temp = st.top(); st.pop(); return temp; } /** Get the front element. */ int peek() { return st.top(); } /** Returns whether the queue is empty. */ bool empty() { return st.empty(); } private: stack<int> st; }; class MyQueue1 { public: /** Initialize your data structure here. */ MyQueue1() { //基本思想:使用两个栈,相当于模拟队列的两头一个栈模拟入队一头,一个栈模拟出队一头 } /** Push element x to the back of queue. */ void push(int x) { st1.push(x); } /** Removes the element from in front of queue and returns that element. */ int pop() { if (!st2.empty()) { int temp = st2.top(); st2.pop(); return temp; } while (!st1.empty()) { int temp = st1.top(); st1.pop(); st2.push(temp); } int temp = st2.top(); st2.pop(); return temp; } /** Get the front element. */ int peek() { if (!st2.empty()) return st2.top(); while (!st1.empty()) { int temp = st1.top(); st1.pop(); st2.push(temp); } return st2.top(); } /** Returns whether the queue is empty. */ bool empty() { return st1.empty() && st2.empty(); } private: stack<int> st1; stack<int> st2; }; int main() { MyQueue1 queue; queue.push(1); queue.push(2); cout << queue.peek() << endl; // 返回 1 cout << queue.pop() << endl; // 返回 1 cout << queue.peek() << endl; // 返回 2 cout << queue.empty() << endl; // 返回 false return 0; }

     

    Processed: 0.015, SQL: 9