本题题目要求如下:
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.
- You must use only standard operations of a stack -- which means only
push to top
,peek/pop from top
,size
, andis 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).
| 8 | | 1 |
| 7 | | 2 |
| 6 | | 3 |
| 5 | | 4 |
假设中间有这么一种状态,左边stack的top是queue的back,左边stack的bottom和右边stack的bottom连接,右边stack的top是queue的front
所以pop就是一直pop右边stack的元素,这样,就会出线右边的全都pop完,此时,下一个元素应该是5,所以,就把左边stack的元素逐个pop到右边stack,状态如下:
| 5 |
| 6 |
| 7 |
|NAN| | 8 |
此时,再去pop,就还是pop右边stack的元素,如果是push,就push到左边stack,如图所示:
| 5 |
| 6 |
| 10| | 7 |
| 9 | | 8 |
这题并不难,叙述了一大堆,其实还是看代码最为清晰,代码如下所示:
class Queue {
public:
// Push element x to the back of queue.
void push(int x) {
my_stack.push(x);
}
// Removes the element from in front of queue.
void pop(void) {
if (tmp_stack.empty()) {
move();
}
tmp_stack.pop();
}
// Get the front element.
int peek(void) {
if (tmp_stack.empty()) {
move();
}
return tmp_stack.top();
}
// Return whether the queue is empty.
bool empty(void) {
return (my_stack.empty() and tmp_stack.empty());
}
private:
stack<int> my_stack;
stack<int> tmp_stack;
void move(void) {
while (!my_stack.empty()) {
tmp_stack.push(my_stack.top());
my_stack.pop();
}
}
};