栈和队列最常考的面试题之一: 使用两个栈实现一个队列
主要思路:
1)建立两个栈input与output,其中input用于入队列,output用于出队列;
2)当元素要入队列时,直接当元素压入input中;
3)当元素要出队列时,先判断output中是否有元素。若是有,可以直接将output中的栈顶元素出队列;若是没有,则先将input中的元素入到output中,再将output的栈顶元素出队列;
4)判断队列是否为空,依次判断input与output是否为空,若有其中一个栈不为空,则队列就不为空。
废话少说,直接上代码啦!!
#include <stack>
template <class T>
class DoubleStackToQueue
{
public:
void Push(const T& data)
{
input.push(data);
}
void Pop()
{
if(!output.empty())
{
output.pop();
}
else
{
if(!input.empty())
{
while(input.size() - 1)
{
output.push(input.top());
input.pop();
}
input.pop();
}
}
}
bool Empty()
{
if(!(input.empty() && output.empty()))
{
return false;
}
return true;
}
T& Front()
{
if(!output.empty())
{
return output.top();
}
if(!input.empty())
{
while(!input.empty())
{
output.push(input.top());
input.pop();
}
return output.top();
}
}
T& Back()
{
if(!input.empty())
{
return input.top();
}
if(!output.empty())
{
while(!input.empty())
{
input.push(output.top());
output.pop();
}
return input.top();
}
}
void Print()
{
if(!Empty())
{
cout<<Front()<<" ";
Pop();
}
}
protected:
stack<T> input, output;
};