您的位置:首页 > 产品设计 > UI/UE

Leetcode NO.232 Implement Queue using Stacks

2015-10-05 08:50 381 查看
本题题目要求如下:

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.
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).

整体思路并不难,就是用两个stack实现,这两个stack合起来就是一个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();
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 面试 leetcode stack queue