题目(leecode T225):
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push
、top
、pop
和 empty
)。
实现 MyStack
类:
void push(int x)
将元素 x 压入栈顶。int pop()
移除并返回栈顶元素。int top()
返回栈顶元素。boolean empty()
如果栈是空的,返回true
;否则,返回false
。
注意:
- 你只能使用队列的标准操作 —— 也就是
push to back
、peek/pop from front
、size
和is empty
这些操作。 - 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
方法:用两个队列来实现栈,因为栈是后进先出的结构,而队列是先进先出的结构,因此当出栈的时候,我们需要从队列的队尾取出元素,而前面的元素我们就需要另一个队列来保存下来,称之为备份的队列。这样我们就可以分析几个函数的写法思路。
push函数:在栈中输入一个元素就是相当于在队列1中输入一个元素。
pop函数:在栈中输出元素,我们需要的是队列1中的最后一个位置的元素。因此我们需要将队列1中除了最后一个位置的元素之外的所有元素都备份到队列2中去。将最后一个位置的元素取出后,再将队列2中的元素全部赋值到队列1中,再将队列2清空即可。
top()函数:取栈的栈首元素即是队列的队尾元素,直接que.back()即可。
empty()函数:只需要判断队列1中的是否为空即可。
题解:
class MyStack {
public:
queue<int> que1;
queue<int> que2;
MyStack() {
}
void push(int x) {
que1.push(x);
}
int pop() {
int size = que1.size();
size--;
while(size--){
que2.push(que1.front()); //将队列1的元素(除了最后一个)全都备份到队列2中
que1.pop();
}
int result = que1.front(); //取出最后一个元素
que1.pop();
que1 = que2; //将备份队列再赋值回来
while(!que2.empty()){
que2.pop(); //清空备份队列
}
return result;
}
int top() {
return que1.back();
}
bool empty() {
return que1.empty();
}
};