主要思路:
1)建立两个队列input与output,其中input用于入栈,output用于出栈;
2)当元素要入栈时,直接当元素压入input中;
3)当元素要出栈时,先判断output中是否有元素。若是有,可以直接将output中的栈顶元素出队列;若是没有,则先将input中的元素入到output中,再判断栈是否为空,若不为空,将output的元素除队尾元素外入到input中,再将output中的栈顶元素出队列;
4)判断队列是否为空,依次判断input与output是否为空,若有其中一个栈不为空,则队列就不为空;
5)求栈顶元素,首先判断栈是否为空,若不为空,将input中的元素入到output中,若output不为空,则打印output队尾元素;
6)求队列的大小,将队列input与output的大小相加即可。
完整的源代码及测试用例如下:
#include <queue>
template <class T>
class Two_Queue_To_Stack
{
public:
//插入
void Push(const T& x)
{
input.push(x);
}
//删除
void Pop()
{
if(!output.empty())
{
output.pop();
}
else
{
while(!input.empty())
{
output.push(input.front());
input.pop();
}
if(!Empty())
{
while(output.size() - 1)
{
input.push(output.front());
output.pop();
}
output.pop();
}
else
{
cout<<"删除时发现该队列为空"<<endl;
}
}
}
//判空
bool Empty()
{
if(!(input.empty() && output.empty()))
{
return false;
}
return true;
}
//栈顶
void Top()
//T& Top()
{
if(!Empty())
{
while(!input.empty())
{
output.push(input.front());
input.pop();
}
if(!output.empty())
{
//return output.top();
cout<<"栈顶: "<<output.back()<<endl;
}
}
else
{
cout<<"求栈顶时发现该队列为空"<<endl;
}
}
//大小
size_t Size()
{
return input.size() + output.size();
}
//打印
void Printf()
{
if(!Empty())
{
cout<<Top()<<" ";
Pop();
}
cout<<endl;
}
protected:
queue<T> input;
queue<T> output;
};
void TestTwo_Queue_To_Stack()
{
Two_Queue_To_Stack<int> q;
q.Push(1);
q.Push(2);
q.Push(3);
q.Push(4);
q.Push(5);
//q.Printf();
q.Pop();
q.Pop();
q.Pop();
//q.Pop();
//q.Pop();
//q.Pop();
//q.Printf();
cout<<"Empty: "<<q.Empty()<<endl;
//cout<<"Top: "<<q.Top()<<endl;
q.Top();
cout<<"Size: "<<q.Size()<<endl;
}