力扣225. 用队列实现栈
题目来源(力扣):
https://leetcode.cn/problems/implement-stack-using-queues/
题目描述:
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
基本思路:
可以参考用栈实现队列 https://www.cnblogs.com/hb-computer/articles/18509570
但是,由于队列始终是先进先出的,即使使用2个队列,[1,2,4,5]最终的出队列状态还是为[1,2,4,5]
因此,用2个队列que1、que2实现栈,其中que2只是用于备份数据,
实际上对于pop操作,先将que1中的元素依次弹出到que2中,直到剩余1个元素,则该元素就是需要pop的元素
代码实现:
class MyStack
{
public:
MyStack()
{
}
void push(int x)
{
que1.push(x);
}
int pop()
{
// 先将que1的元素弹出到que2,且que1中剩余1个
while (que1.size() > 1)
{
que2.push(que1.front());
que1.pop();
}
int tmp = que1.front();
que1.pop();
// 再将que2中的元素弹回que1
while (que2.size() > 0)
{
que1.push(que2.front());
que2.pop();
}
return tmp;
}
int top()
{
int tmp = this->pop(); // 代码复用
que1.push(tmp);
return tmp;
}
bool empty()
{
if (que1.size() == 0 && que2.size() == 0)
return 1;
return 0;
}
private:
queue<int> que1, que2;
};
时间复杂度
push:O(1)
pop/top:O(n)
empty:O(1)
补充-只使用1个队列的写法
由于que2的只是用于临时存放数据,所以实际上可以将其优化掉,
只使用1个队列,并且用len维护长度,就能利用1个队列实现2个队列才能完成的工作,如下:
class MyStack
{
public:
MyStack()
{
len = 0;
}
void push(int x)
{
que1.push(x);
len++;
}
int pop()
{
int tmp_len = len;
while (tmp_len > 1)
{
que1.push(que1.front());
que1.pop();
tmp_len--;
}
int tmp = que1.front();
que1.pop();
len--;
return tmp;
}
int top()
{
int tmp = this->pop(); // 代码复用
que1.push(tmp);
len++;
return tmp;
}
bool empty()
{
if (que1.size() == 0)
return 1;
return 0;
}
private:
queue<int> que1;
int len;//维护长度
};
时间复杂度不变
浙公网安备 33010602011771号