题目概述
用两个栈实现一个队列
解题思路
栈的特点是后进先出,而队列是先进先出;为了用两个栈实现一个队列,我们还是需要两个栈来实现
其中一个栈为sin,主要操纵入队;另一个栈为sout,主要用来从此出队
图解
代码实现
//两个栈实现一个队列
template<typename T>
class QueueBTS
{
public:
void Push(const T& x)
{
sin.push(x);
}
void Pop()
{
assert(!sin.empty() || !sout.empty());
if (sout.empty())
{
while (!sin.empty())
{
sout.push(sin.top());
sin.pop();
}
}
sout.pop();
}
const T& Front()
{
assert(!sin.empty() || !sout.empty());
if (sout.empty())
{
while (!sin.empty())
{
sout.push(sin.top());
sin.pop();
}
}
return sout.top();
}
protected:
stack<T> sin;//入列的栈
stack<T> sout;//出列的栈
};
题目扩展
两个队列实现一个栈
解题思路
这里我们也是,定义两个队列,第一个队列qin主要负责元素的入栈;第二个队列qout负责出栈
图解
代码实现
//两个队列实现一个栈
template<typename T>
class StackBTQ
{
public:
void Push(const T& x)
{
//入栈的元素直接push到qin里面
qin.push(x);
}
void Pop()
{
assert(!qin.empty() || !qout.empty());
//qin队列为空
if (qin.empty())
{
while (qout.size() > 1)
{
qin.push(qout.front());
qout.pop();
}
qout.pop();
}
else//qin队列不为空
{
while (qin.size() > 1)
{
qout.push(qin.front());
qin.pop();
}
qin.pop();
}
}
T Top()
{
assert(!qin.empty() || !qout.empty());
//qin队列为空
if (qin.empty())
{
while (qout.size() > 1)
{
qin.push(qout.front());
qout.pop();
}
return qout.front();
}
else//qin队列不为空
{
while (qin.size() > 1)
{
qout.push(qin.front());
qin.pop();
}
return qin.front();
}
}
protected:
queue<T> qin;
queue<T> qout;
};