LeetCode225.用队列实现栈
文章目录
- LeetCode225.用队列实现栈
- 题目描述
- 实现1:
- 实现2:
题目描述
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
实现1:
入栈:把数据push到主队列
出栈:把主队列中n-1个数据导入到副队列,主队列只剩下最后进入的元素,出队即可(模拟后进先出)
top:栈顶元素就是主队列的队尾(back)
判空:判断主队列是否为空
代码:
class MyStack {
public:
MyStack() {
}
void push(int x) {
main_q.push(x);
}
int pop() {
//先导入到辅助栈
while(main_q.size() > 1)
{
aux_q.push(main_q.front());
main_q.pop();
}
int pop_value = main_q.front(); //记录pop的元素
main_q.pop();//把最后一个元素出队 -> 实现出栈效果
//然后把数据导回去
while(!aux_q.empty())
{
main_q.push(aux_q.front());
aux_q.pop();
}
return pop_value;
}
int top() {
return main_q.back();
}
bool empty() {
return main_q.empty();
}
private:
queue<int> main_q;
queue<int> aux_q;
};
实现2:
-
入栈:先将元素入队到副队列,再将主队列的全部元素依次出队并入队到副队列。副队列的front就是新入栈的元素。然后将主队列和副队列交换(保持副队列为空),主队列的元素就是栈内的元素。主队列的front就是栈顶,back就是栈底。
-
出栈:主队列出队
-
取栈顶:主队列的front
-
判空:主队列是否为空
代码:
class MyStack {
public:
MyStack() {}
void push(int x) {
// 先push到副队列
aux_q.push(x);
// 主队列的元素push到副队列
while (!main_q.empty()) {
aux_q.push(main_q.front());
main_q.pop();
}
// 此时主队列为空,主队列和副队列交换
main_q.swap(aux_q);
}
int pop() {
int pop_val = main_q.front();
main_q.pop();
return pop_val;
}
int top() { return main_q.front(); }
bool empty() { return main_q.empty(); }
private:
queue<int> main_q;
queue<int> aux_q;
};