problem:
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.
Example:
MyStack stack = new MyStack();
stack.push(1);
stack.push(2);
stack.top(); // returns 2
stack.pop(); // returns 2
stack.empty(); // returns false
tip:
使用队列实现栈.
solution:
1.使用两个队列,其中一个队列来模拟栈顶元素.
class MyStack {
public:
MyStack() {}
void push(int x) {
q2.push(x);
while(q2.size()>1)
//q1.push(q2.pop());这种写法是错误的,因为pop没有返回值
{q1.push(q2.front());
q2.pop();}
}
int pop() {
int x=top();
q2.pop();
return x;
}
int top() {
if(q2.empty())
{
for(int i = 0;i<(int)q1.size()-1;i++)
{
q1.push(q1.front());
q1.pop();
}
q2.push(q1.front());
q1.pop();
}
return q2.front();
}
bool empty() {
return q1.empty() && q2.empty();
}
private:
queue<int> q1,q2;
};
2.每次把新插入的元素插入到前面,保证队列中的元素与栈中元素顺序相反,这样可以直接按照队列的方法实现.
class MyStack {
public:
MyStack() {}
void push(int x) {
q.push(x);
for(int i = 0;i < q.size()-1;i++)
{
q.push(q.front());
q.pop();
}
}
int pop() {
int x= q.front();
q.pop();
return x;
}
int top() {
int x=q.front();
return x;
}
bool empty() {
if(q.empty())
return true;
else return false;
}
private:
queue<int> q;
};