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

[LeetCode] Implement Stack using Queues

2015-06-11 20:09 501 查看
Implement the following operations of a stack using queues.

push(x) – Push element x onto stack.

pop() – Removes the element on top of the stack.

top() – Get the top element.

empty() – Return whether the stack is empty.

Notes:

You may assume that all operations are valid (for example, no pop or top operations will be called on an empty stack).

Depending on your language, queue may not be supported natively. You may simulate a queue by using a list or deque (double-ended queue), as long as you use only standard operations of a queue – which means only push to back, pop from front, size, and is empty operations are valid.

解题思路

使用两个队列q1和q2,在q1上进行top()和push()操作,每次操作前把所有元素集中到q1中。

实现代码

// Runtime: 0 ms 暂时理解为计时故障
class Stack {
public:
// Push element x onto stack.
void push(int x) {
gather(q1, q2);
q1.push(x);
}

// Removes the element on top of the stack.
void pop() {
gather(q1, q2);
while (q1.size() > 0 && q1.size() != 1)
{
q2.push(q1.front());
q1.pop();
}
q1.pop();
}

// Get the top element.
int top() {
gather(q1, q2);
while (q1.size() > 0 && q1.size() != 1)
{
q2.push(q1.front());
q1.pop();
}
int n = q1.front();
q2.push(q1.front());
q1.pop();

return n;
}

// Return whether the stack is empty.
bool empty() {
return q1.empty() && q2.empty();
}
private:
queue<int> q1;
queue<int> q2;
void gather(queue<int>& q1, queue<int>& q2)
{
while (!q2.empty())
{
q1.push(q2.front());
q2.pop();
}
}
};


由于每次push()、top()或者pop()之后都有一个队列为空,因此直接将q1设为有元素的队列即可。可以省去出入队列的时间。

// Runtime: 0 ms
class Stack {
public:
// Push element x onto stack.
void push(int x) {
toQ1(q1, q2);
q1.push(x);
}

// Removes the element on top of the stack.
void pop() {
toQ1(q1, q2);
while (q1.size() > 0 && q1.size() != 1)
{
q2.push(q1.front());
q1.pop();
}
q1.pop();
}

// Get the top element.
int top() {
toQ1(q1, q2);
while (q1.size() > 0 && q1.size() != 1)
{
q2.push(q1.front());
q1.pop();
}
int n = q1.front();
q2.push(q1.front());
q1.pop();

return n;
}

// Return whether the stack is empty.
bool empty() {
return q1.empty() && q2.empty();
}
private:
queue<int> q1;
queue<int> q2;
void toQ1(queue<int>& q1, queue<int>& q2)
{
if (q1.empty())
{
q1 = q2;
queue<int> q;
q2 = q;
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: