力扣232. 用栈实现队列
题目来源(力扣):
https://leetcode.cn/problems/implement-queue-using-stacks/
题目描述:
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty)
基本思路:
队列是先进先出的STL,而栈是先进后出的STL。
要利用栈实现队列,则应该使用2个栈sta1、sta2,
其中sta1用于存放push操作插入的值,
sta2用于pop、peek操作输出队首的数据,
4种操作(push、pop、peek、empty)依次对应于:
push:
直接插入到sta1的栈顶
pop:
如果sta2不为空则返回sta2的栈顶并且删除sta2的栈顶元素;
如果sta2为空,则依次弹出sta1的栈顶元素,再依次输入到sta2中,最后返回sta2的栈顶并且删除sta2的栈顶元素。
例如sta1:[1,2],sta2[]:[],此时调用pop,应该输出的数为[1]
而sta2.size()为0,sta1.top()为2,
将sta1的栈顶依次弹出到sta2,则
sta1:[], sta2:[2,1]
弹出sta2栈顶,sta.top()为[1]
之后sta1[]:[],sta2:[2]
peek:
与pop类似,只是不需要删除sta2的栈顶元素而只返回即可
empty:
判断是否sta1.size()为0且sta2.size()为0
因此,代码如下:
代码实现:
class MyQueue
{
public:
MyQueue()
{
}
void push(int x)
{
sta1.push(x);
}
int pop()
{
if (sta2.size())
{
int tmp = sta2.top();
sta2.pop();
return tmp;
}
else
{
while (sta1.size())
{
sta2.push(sta1.top());
sta1.pop();
}
int tmp = sta2.top();
sta2.pop();
return tmp;
}
}
int peek()
{
if (sta2.size())
{
int tmp = sta2.top();
// sta2.pop();
return tmp;
}
else
{
while (sta1.size())
{
sta2.push(sta1.top());
sta1.pop();
}
int tmp = sta2.top();
// sta2.pop();
return tmp;
}
}
bool empty()
{
if (sta1.size() == 0 && sta2.size() == 0)
return 1;
return 0;
}
private:
stack<int> sta1, sta2;
};
时间复杂度
push:O(1)
pop/peek:O(1)~O(n),一般认为均摊O(1)。对于每个元素,至多入栈和出栈各两次,故均摊复杂度为 O(1)。
empty:O(1)
补充
由于pop和peek操作过于类似,因此可以代码复用,如下:
class MyQueue
{
public:
MyQueue()
{
}
void push(int x)
{
sta1.push(x);
}
int pop()
{
if (sta2.size())
{
int tmp = sta2.top();
sta2.pop();
return tmp;
}
else
{
while (sta1.size())
{
sta2.push(sta1.top());
sta1.pop();
}
int tmp = sta2.top();
sta2.pop();
return tmp;
}
}
int peek()
{
int tmp = this->pop();
sta2.push(tmp);
return tmp;
}
bool empty()
{
if (sta1.size() == 0 && sta2.size() == 0)
return 1;
return 0;
}
private:
stack<int> sta1, sta2;
};
浙公网安备 33010602011771号