//两个栈实现一个队列 #include<stack> //STL #include<iostream> using namespace std; template<class T> class CQueue { public: CQueue(); ~CQueue(); void appendTail(const T& node); T deleteHead(); private: stack<T> stack1; stack<T> stack2; }; //思路:一个栈做添加队尾元素用;另一个做删除队首元素用。 // 操作时,对应栈有数据,另一个为空。 template<class T> CQueue<T>::CQueue() { } template<class T> CQueue<T>::~CQueue() { } //stack1作为添加队尾元素的栈 template<class T> void CQueue<T>::appendTail(const T& node) { if(stack1.empty()) { while(!stack2.empty()) { T temp = stack2.top(); stack1.push(temp); stack2.pop(); } stack1.push(node); } else stack1.push(node); } //stack2作为删除队首元素的栈 template<class T> T CQueue<T>::deleteHead() { T Head; if(stack2.empty()) { if(stack1.empty()) { cerr<<"This Queue is already empty!" <<"Have no to be deleted!"<<endl; exit(1); } while(!stack1.empty()) { T temp = stack1.top(); stack2.push(temp); stack1.pop(); } Head = stack2.top(); stack2.pop(); } else { Head = stack2.top(); stack2.pop(); } return Head; } int main(int argc, char* argv[]) { CQueue<char> q1; q1.appendTail('a'); q1.appendTail('b'); q1.appendTail('c'); q1.appendTail('d'); q1.appendTail('e'); char Head = q1.deleteHead(); cout<<Head<<endl; Head = q1.deleteHead(); cout<<Head<<endl; q1.appendTail('f'); q1.appendTail('g'); Head = q1.deleteHead(); cout<<Head<<endl; Head = q1.deleteHead(); cout<<Head<<endl; Head = q1.deleteHead(); cout<<Head<<endl; Head = q1.deleteHead(); cout<<Head<<endl; return 0; }
自己所做如上所示。思路就是:一个做删除栈;一个做添加栈。
相比较于作者的思想,虽然大体一致,但自己的思想有多余的部分:
在添加元素的时候,无论stack1是否为空,作者采取的策略为直接入栈,而自己却是先将stack2中的元素再弹出压入stack1,这一步根本就是多余的!
作者代码如下:(自己默写)
//作者代码,更简洁! //stack1做入队操作,直接入队 template<typename T> void CQueue<T>::appendTail(const T& node) { stack1.push(node); } //stack2做出队操作 template<typename T> T CQueue<T>::deleteHead() { if(stack2.empty()) { while(stack1.empty()) { T head = stack1.top(); stack2.push(head); stack1.pop(); } } if(stack2.empty()) throw new exception("queue is empty."); T Head = stack2.top(); stack2.pop(); return Head; }
作者代码的结构安排更紧凑,更简洁!!!