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

来源:互联网 发布:java二叉树非递归 编辑:程序博客网 时间:2024/05/22 09:50
栈和队列最常考的面试题之一:  使用两个队列实现一个栈

主要思路:

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


 

 

0 0