用队列实现栈
用队列实现栈的四个操作:
- push(x)——元素x入栈
- pop()——移出栈顶元素
- top()——获取栈顶元素
- empty()——返回栈是否为空
注意:
- 只能使用队列的基本操作,即只可以调用队列的push to back,pop from front,size和is empty操作。
- 若使用的语言不支持队列,可以使用list或者deque(双端队列)来模拟一个队列。
- 假设所有的操作都是有效的,例如,对一个空的栈不会调用pop或者top操作。
栈:一种后进先出的数据结构,元素从顶端入栈,从顶端出栈。
队列:一种先进先出的数据结构,元素从后端入队,从前端出队。
方法一:两个队列
为了满足栈的特性,即最后入栈的元素最先出栈,在使用队列实现栈时,应该满足队列前端的元素是最后入栈的元素。
可以使用两个队列实现栈的操作,其中queue1用于存储栈内的元素,queue2作为入栈操作的辅助队列。
入栈操作时,首先将元素入队到queue2,然后将queue1的全部元素依次出队并入到queue2,此时queue2的前端的元素即为新入栈的元素,再将queue1和queue2互换,则queue1的元素即为站内的元素,queue1的前端和后端对应栈顶和栈底。
由于每次入栈都确保queue1的前端元素为栈顶。
出栈只需要移除queue1的前端元素并返回即可,获得栈顶元素操作只需要获得queue1的前端元素并返回即可(不移出元素)。
class MyStack{
public:queue<int> queue1;queue<int> queue2;Mystack(){}void push(int x){queue2.push(x);while(!queue1.empty){queue2.push(queue1.front());queue1.pop();}swap(queue1,queue2);}int pop(){int r = queue1.front();queue1.pop();return r;}int top(){int r = queue1.front();return r;}bool empty(){return queue1.empty();}
}