~使用两个栈实现一个队列(优化版)~

来源:互联网 发布:leve12行情软件 编辑:程序博客网 时间:2024/06/05 12:00

之前有篇博客中已经实现了这道题目,可最近回过头来仔细再看这道题时,才发现当初实现的有够挫的,竟然没有考虑好异常,导致程序有一些的漏洞:

1.空队列删除时会直接使程序崩溃;

2.空队列求队头时时会直接使程序崩溃;

3.空队列求队尾时时会直接使程序崩溃;

 

若是不懂本题的思路,可以查看我的这篇博客,http://blog.csdn.net/manongdeyipiant/article/details/70197256,在这里我就不赘述了!

 

改良版的源代码及测试用例如下:

#include <stack>template <class T>class Two_Stack_To_Queue{public://插入void Push(const T& x){input.push(x);}//删除void Pop(){if(!output.empty()){output.pop();}else{while(!input.empty()){output.push(input.top());input.pop();}if(!Empty()){output.pop();}else{cout<<"删除时发现该队列为空"<<endl;}}}//判空bool Empty(){if(!(input.empty() && output.empty())){return false;}return true;}//队头void Front()//T& Front(){if(!Empty()){if(!output.empty()){//return output.top();cout<<"队头: "<<output.top()<<endl;}else{while(!input.empty()){output.push(input.top());input.pop();}//return output.top();cout<<"队头: "<<output.top()<<endl;}}else{cout<<"求队头时发现该队列为空"<<endl;}}//队尾void Back()//T& Back(){if(!Empty()){if(!input.empty()){//return input.top();cout<<"队尾: "<<input.top()<<endl;}else{while(!output.empty()){input.push(output.top());output.pop();}//return input.top();cout<<"队尾: "<<input.top()<<endl;}}else{cout<<"求队尾时发现该队列为空"<<endl;}}//大小size_t Size(){return input.size() + output.size();}//打印void Printf(){while(!Empty()){cout<<Front()<<" ";Pop();}cout<<endl;}protected:stack<T> input;stack<T> output;};void TestTwo_Stack_To_Queue(){Two_Stack_To_Queue<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<<"Front: "<<q.Front()<<endl;//cout<<"Back: "<<q.Back()<<endl;q.Front();q.Back();cout<<"Size: "<<q.Size()<<endl;}


 

0 0
原创粉丝点击