标签:
Implement the following operations of a stack using queues.
Notes:
push to back, peek/pop from front, size, and is empty operations are valid.分析:用(两个)队列实现栈
设置两个队列分别为1和2
(1)入栈:如果队列2当前有元素,而队列1为空(反之亦然),那么将需要入栈的元素放入队列1中,然后将队列2中的元素依次出队并入队到队列1中。(即要保证有一个队列是空的)
(2)出栈:将有元素(不为空)的队列出队即可-------如:
先将元素a插入队列1中 ,现在要将元素b入栈,则将b插入到队列2中然后将队列1中的a出队到队列2中,则队列2中的元素变为 b,a
这样队列1为空,现在要压入c, 则将c插入队列1中 ,依次将队列2中的b ,a出队并加入到队列1中 ,则队列1中的元素变为 c,b,a,而队列2为空
(保证一队列为空)
代码如下:
【两个队列】
class Stack {
public:
// Push element x onto stack.
queue<int> queue1;
queue<int> queue2;
void push(int x) {
if (queue1.empty())
{
queue1.push(x);
while(!queue2.empty()){
int tmp = queue2.front();
queue2.pop();
queue1.push(tmp);
}
}else{
queue2.push(x);
while(!queue1.empty()){
int tmp = queue1.front();
queue1.pop();
queue2.push(tmp);
}
}
}
// Removes the element on top of the stack.
void pop() {
if (!queue1.empty())
queue1.pop();
if (!queue2.empty())
queue2.pop();
}
// Get the top element.
int top() {
if (!queue1.empty())
return queue1.front();
if (!queue2.empty())
return queue2.front();
}
// Return whether the stack is empty.
bool empty() {
return queue1.empty() && queue2.empty();
}
};
其他解法:
【两个队列】用两个队列myStack,temp实现一个栈。push时把新元素添加到myStack的队尾。pop时把myStack中除最后一个元素外逐个添加到myStack中,然后pop掉myStack中的最后一个元素,然后注意记得myStack和temp,以保证我们添加元素时始终向temp中添加。
class Stack {
public:
// Push element x onto stack.
void push(int x) {
myStack.push(x);
}
// Removes the element on top of the stack.
void pop() {
std::queue<int> temp;
int len = myStack.size();
for(int i = 0; i < len - 1; i++) {
temp.push(myStack.front());
myStack.pop();
}
myStack = temp;
}
// Get the top element.
int top() {
if(myStack.size() != 0) return myStack.back();
}
// Return whether the stack is empty.
bool empty() {
if(myStack.size() == 0) return true;
else return false;
}
private:
std::queue<int> myStack;
};
或:
【两个队列】
class Stack {
queue<int> rev_q;
public:
// Push element x onto stack.
void push(int x) {
queue<int> temp_q;
temp_q.push(x);
while (!rev_q.empty()) {
temp_q.push(rev_q.front());
rev_q.pop();
}
rev_q = temp_q;
}
// Removes the element on top of the stack.
void pop() {
rev_q.pop();
}
// Get the top element.
int top() {
return rev_q.front();
}
// Return whether the stack is empty.
bool empty() {
return rev_q.empty();
}
};
【一个队列】---push时直接添加到队尾就好。pop和top时,把队列除最后一个元素外,逐个循环添加到队列的尾部。
class Stack {
public:
// Push element x onto stack.
void push(int x) {
unsigned int size = s.size();
this->s.push(x);
while (size--){
s.push(s.front());
s.pop();
}
}
// Removes the element on top of the stack.
void pop() {
s.pop();
}
// Get the top element.
int top() {
return s.front();
}
// Return whether the stack is empty.
bool empty() {
return s.empty();
}
private:
queue<int> s;
};
附注:队列queue的成员函数
leetcode:Implement Stack using Queues
标签:
原文地址:http://www.cnblogs.com/carsonzhu/p/4629910.html