欢迎访问我的剑指offer(第二版)题解目录哦
对应的Leetcode题目可点击leetcode 232. Implement Queue using Stacks。
题目描述
Implement the following operations of a queue using stacks.
- push(x) – Push element x to the back of queue.
- pop() – Removes the element from in front of queue.
- peek() – Get the front element.
- empty() – Return whether the queue is empty.
Example:
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // returns 1
queue.pop(); // returns 1
queue.empty(); // returns false
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, stack may not be supported natively. You may simulate a stack by using a list or deque (double-ended queue), as long as you use only standard operations of a stack.
- You may assume that all operations are valid (for example, no pop or peek operations will be called on an empty queue).
算法设计
使用两个栈,一个栈s1
用来负责模拟队列的压入元素操作,一个栈s2
负责模拟队列的弹出元素操作。当需要向队列中压入元素时,直接向栈s1
中压入这个元素。当需要从队列弹出队首元素时,首先检查栈s2
是否为空,如果是空,则将栈s1
中所有元素逐个弹出到栈s2
中,然后弹出s2
栈顶元素即可;如果不为空,直接弹出s2
栈顶元素。
C++代码
class MyQueue {
public:
/** Initialize your data structure here. */
stack<int> s1, s2;
MyQueue() {}
/** Push element x to the back of queue. */
void push(int x) { s1.push(x); }
/** Removes the element from in front of queue and returns that element. */
int pop() {
move_elements();
int x = s2.top();
s2.pop();
return x;
}
/** Get the front element. */
int peek() {
move_elements();
return s2.top();
}
/** Returns whether the queue is empty. */
bool empty() { return s1.empty() and s2.empty(); }
void move_elements() {
if (s2.empty()) {
while (not s1.empty()) {
s2.push(s1.top());
s1.pop();
}
}
}
};
/**
* 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();
*/