原题链接:Leetcode 232. Implement Queue using Stacks
Implement a first in first out (FIFO) queue using only two stacks. The implemented queue should support all the functions of a normal queue (push, peek, pop, and empty).
Implement the MyQueue class:
- void push(int x) Pushes element x to the back of the queue.
- int pop() Removes the element from the front of the queue and returns it.
- int peek() Returns the element at the front of the queue.
- boolean empty() Returns true if the queue is empty, false otherwise.
Notes:
You must use only standard operations of a stack, which means only push to top, peek/pop from top, size, and is empty operations are valid.
Depending on your language, the stack may not be supported natively. You may simulate a stack using a list or deque (double-ended queue) as long as you use only a stack’s standard operations.
Example 1:
Input ["MyQueue", "push", "push", "peek", "pop", "empty"] [[], [1], [2], [], [], []] Output [null, null, null, 1, 1, false] Explanation MyQueue myQueue = new MyQueue(); myQueue.push(1); // queue is: [1] myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue) myQueue.peek(); // return 1 myQueue.pop(); // return 1, queue is [2] myQueue.empty(); // return false
Constraints:
- 1 <= x <= 9
- At most 100 calls will be made to push, pop, peek, and empty.
- All the calls to pop and peek are valid.
Follow-up:
Can you implement the queue such that each operation is amortized O(1) time complexity? In other words, performing n operations will take overall O(n) time even if one of those operations may take longer.
方法一:模拟 思路:
栈是先入后出的,队列是先入先出的。
用两个栈(输入栈和输出栈)通过倒转输入的序列来实现队列
class MyQueue {
private:
// 一个输入栈 一个输出栈
stack inStack, outStack;
// 将输入栈的元素依次添加到输出栈中
void transfer() {
while (!inStack.empty()) {
outStack.push(inStack.top());
inStack.pop();
}
}
public:
MyQueue() {}
// 入队
void push(int x) {
inStack.push(x);
}
// 出队
int pop() {
if (outStack.empty()) {
transfer();
}
int x = outStack.top();
outStack.pop();
return x;
}
// 返回队头元素
int peek() {
if (outStack.empty()) {
transfer();
}
return outStack.top();
}
// 判断是否为空
bool empty() {
return inStack.empty() && outStack.empty();
}
};
复杂度分析:
- 时间复杂度:
- 空间复杂度:



