用两个栈实现一个队列
1、思路分析
拿到这道题,会有以下几种思路:
思路一:- 入队时,将所有的元素压入到s1中
- 出队时,将s1中的所有元素倒入到s2中,然后让s2中栈顶的元素出栈,然后将s2中所有的元素倒入到s1中
问题所在:我们不难发现,在这种解法中,要进行来回倒栈,时间复杂度就会比较大,做起来也比较麻烦
思路二:
说明:是对第一种的优化我们不难发现,其实在进行倒栈的时候,没必要进行最后一个元素的倒入- 入队时,先判断s1是否为空,如果不为空,说明所有的元素都在s1中,此时将入队的元素直接压入s1中;如果s1为空,将s2中所有的元素倒入到s1中,将入队的元素压入s1中
- 出队时,如果s2不为空,将s2栈顶的元素弹出,如果s2为空,将s1中除最后一个元素压入s2中,将最后一个元素出栈
说明:这种方法其实是将两个栈更进一步的同时利用。每次出队后,并不将元素“倒回”s1,如果赶上下次还是出队操作,效率会高一些。
思路三:- 入队时,将所有的元素压入s1
- 出队时,判断s2是否为空,如果为不为空,直接将栈顶的元素弹出,如果s2为空,将s1中的元素倒入s2中,将最后一个元素弹出
2、代码实现
(说明:对第三种方法的实现)
#include<iostream>
#include<stack>
using namespace std;
template<class T>
class Queue
{
public:
Queue()
{}
void Push(const T& x)
{
s1.push(x);
}
void Pop()
{
if(s1.empty() && s2.empty())
cout<<"队列为空,无法进行删除!"<<endl;
if(s2.empty())
{
while(!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
}
s1.pop();
}
bool Empty()
{
return ((s1.empty()) && (s2.empty()));
}
T& Front()
{
if(s1.empty() && s2.empty())
{
cout<<"队列为空!"<<endl;
}
if(s2.empty())
{
while(!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
}
return s2.top();
}
private: