~使用两个队列实现一个栈~

时间:2020-12-16 17:39:27
栈和队列最常考的面试题之一:  使用两个队列实现一个栈

主要思路:

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;
}