【Leetcode】225. 用队列实现栈
题目
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
- void push(int x) 将元素 x 压入栈顶。
- int pop() 移除并返回栈顶元素。
- int top() 返回栈顶元素。
- boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
思路
-
方法1
- 初始化两个队列
- 入栈:直接将元素送入队列1
- 出栈操作:先将队列1中除了最后一个元素(最后进入的元素)以外的所有元素全部送入队列2,然后将最后一个元素出队,完成出栈操作,最后将队列2中的所有元素全部入队列1
-
方法2
- 将队列1的元素除了最后一个元素全部送入队尾(重新入队)
代码
- 方法1
class MyStack {
public:
queue<int> que1;
queue<int> que2;
MyStack() {
}
void push(int x) {
// 直接入队列即可
que1.push(x);
}
int pop() {
// 栈:先进后出 后进先出
// 队列1将除了最后一个元素以外的所有元素全部送进队列2,因为队列是先进先出 队尾进元素
// 然后将队列1的最后一个元素出队
int size = que1.size();
size--;// 保留最后一个元素
while(size--)
{
que2.push(que1.front());//将队列1元素入队列2
que1.pop();
}
int result = que1.front();// 最后一个元素就是结果
que1.pop();// 将最后一个元素出队 完成出栈操作
// 将队列2中的元素送回队列1
while(!que2.empty())
{
que1.push(que2.front());
que2.pop();
}
return result;
}
int top() {
return que1.back();
}
bool empty() {
return que1.empty();
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/
- 方法2
class MyStack {
public:
queue<int> que;// 使用一个队列完成栈的操作
MyStack() {
}
void push(int x) {
que.push(x);
}
int pop() {
int size = que.size();
size--;// 保留最后一个元素
while(size--)
{
// 将队列头部元素重新添加至队尾 除了最后一个元素
que.push(que.front());
que.pop();
}
int result = que.front();
que.pop();// 将最后一个元素出队
return result;
}
int top() {
return que.back();
}
bool empty() {
return que.empty();
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/