方法:模拟
栈:后进后出,顶端入,顶端出
队列:先进先出,队尾进,队头出
采用的方法是用两个队列来模拟栈的操作
- queue1用来存储栈内的元素,queue2作为入栈操作的辅助队列
- 入栈操作时,先将元素入栈到queue2,然后将queue1的元素出队再入队到queue2,此时queue2的前端都是新入栈的元素,然后再swap(queue1,queue2),queue1内的元素就是栈内的元素,queue1的前端就是栈顶,后端就是栈底
- 出栈操作和获得栈顶元素操作都很容易实现 因为入栈操作queue1的前端都是栈顶元素,出栈移除queue1的前端并return,获得栈顶元素只要获得queue1的前端并return
- 判断栈是否为空,只需要判断queue1是否为空
class MyStack
{
public:
queue<int> queue1;
queue<int> queue2;
/** Initialize your data structure here. */
MyStack()
{
}
/** Push element x onto stack. */
void push(int x)
{
queue2.push(x);
while (!queue1.empty()) //判断queue1是否为空,如果为空,就不需要将queu1中的元素加入queue2
{
queue2.push(queue1.front());
queue1.pop();
}
swap(queue1, queue2);
}
/** Removes the element on top of the stack and returns that element. */
int pop()
{
int r = queue1.front();
queue1.pop();
return r;
}
/** Get the top element. */
int top()
{
int r = queue1.front();
return r;
}
/** Returns whether the stack is empty. */
bool empty()
{
return queue1.empty();
}
};