例题描述
使用队列实现栈的下列操作:
push(x)
– 元素 x 入栈
pop()
– 移除栈顶元素
top()
– 获取栈顶元素
empty()
– 返回栈是否为空
注意:
- 你只能使用队列的基本操作-- 也就是
push to back
,peek/pop from front
,size
, 和is empty
这些操作是合法的。 - 你所使用的语言也许不支持队列。 你可以使用
list
或者deque
(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。 - 你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用
pop
或者top
操作)。
解题思路
push(x)
压栈:与入队一致,直接调用push
函数逐个入队即可。pop()
弹栈:让除过队尾元素的元素逐个出队,再逐个入队,保持队序不变。这时队尾元素就到达了队首,弹栈操作即就是它的出队操作。top()
获取栈顶元素:与弹栈大同小异,不同之处只是记录下队尾值,最后将队尾元素重新入队而已,但弹栈不重新入队。empty()
返回栈是否为空:直接调用队列的empty
函数,判定队内是否为空。
图文
假定队内元素按顺序分别为:9
、5
、2
、7
。
弹栈
pop
:栈为FILO
型规则(First In Last Out),用队列来实现就是先入队的,最后出队。那么此时移除栈顶元素,就是移除队尾元素7
。
实现方式是:使用临时变量,针对队尾元素之前的值,每周期保存一次,紧跟着入队一次即可,形成弹栈行为。
代码实现
class MyStack {
public:
queue<int> q; //建立对象
//1. 压栈
void push(int x) {
q.push(x);
}
//2. 弹栈/出栈
int pop() {
int size = q.size();
for(int i = 0;i < size - 1;i++){
int v = q.front();
q.pop();
q.push(v);
}
int v = q.front();
q.pop();
return v;
}
//3. 获取栈顶元素
int top() {
//拿到队列元素个数,通过出队再入队计数,剩下最后一个处于队首单独处理
int size = q.size();
for(int i = 0;i < size - 1;i++){
int v = q.front();
q.pop();
q.push(v);
}
//取出队首“栈顶”元素
int v = q.front();
q.pop();
q.push(v);
return v;
}
//4. 判断是否为空
bool empty() {
return q.empty();
}
};