题目描述
请用栈实现队列的如下四种操作:
- push(x) – 将x插入队尾;
- pop() – 弹出队首元素;
- peek() – 返回队首元素;
- empty() – 返回队列是否为空;
样例
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // returns 1
queue.pop(); // returns 1
queue.empty(); // returns false
算法
(栈,队列) $O(n)$
这道题目与 LeetCode 225. Implement Stack using Queues 类似。
我们用一个栈来存储队列中的元素,另外还需要一个辅助栈,用来辅助实现 pop() 和 peek() 操作。
四种操作的实现方式如下:
- push(x) – 直接将x插入栈顶;
- pop() – 即需要弹出栈底元素,我们先将栈底以上的所有元素插入辅助栈中,然后弹出栈底元素,最后再将辅助栈中的元素重新压入当前栈中;
- peek() – 返回栈顶元素,同理,我们先将栈底以上的所有元素插入辅助栈中,然后输出栈底元素,最后再将辅助栈中的元素重新压入当前栈中,恢复当前栈原状;
- empty() – 返回当前栈是否为空;
时间复杂度分析:push(x) 和 emtpy() 均只有一次操作,时间复杂度是 $O(1)$;pop() 和 peek() 涉及到 $n$ 次操作,所以时间复杂度是 $O(n)$。
C++ 代码
class MyQueue {
public:
/** Initialize your data structure here. */
stack<int>sta, cache;
MyQueue() {
}
/** Push element x to the back of queue. */
void push(int x) {
sta.push(x);
}
/** Removes the element from in front of queue and returns that element. */
int pop() {
while (!sta.empty()) cache.push(sta.top()), sta.pop();
int x = cache.top();
cache.pop();
while (!cache.empty()) sta.push(cache.top()), cache.pop();
return x;
}
/** Get the front element. */
int peek() {
while (!sta.empty()) cache.push(sta.top()), sta.pop();
int x = cache.top();
while (!cache.empty()) sta.push(cache.top()), cache.pop();
return x;
}
/** Returns whether the queue is empty. */
bool empty() {
return sta.empty();
}
};
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue obj = new MyQueue();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.peek();
* bool param_4 = obj.empty();
*/
peek() – 返回栈底元素。。。栈顶
手误,已修正~