標籤:棧的應用
1.
//使用兩個隊列實現一個棧,最佳化版(1.入棧只如q1,出棧將q1資料倒q2,刪掉剛進來的,//若q1無資料,從q2倒,刪q2中最後一個資料2.只保證一個棧中有資料,簡單,易理解)//第一種實現
650) this.width=650;" src="http://s1.51cto.com/wyfs02/M00/7F/6A/wKioL1cd95KCQJclAAA6iAxO2ew552.png" title="無標題.png" alt="wKioL1cd95KCQJclAAA6iAxO2ew552.png" />
template<class T>class Stack{public:bool Empty(){return _q1.empty() && _q2.empty();}void Push(const T& x){_q1.push(x);}void Pop(){assert((!_q1.empty()) || (!_q2.empty()));if (_q1.empty()){while (_q2.size()!= 1){_q1.push(_q2.front());_q2.pop();}_q2.pop();}else{while (_q1.size()!= 1){_q2.push(_q1.front());_q1.pop();}_q1.pop();}}int Size(){return _q1.size() + _q2.size();}//先取_q1的back,若_q1為空白,再取_q2的值T& Top(){assert((!_q1.empty()) || (!_q2.empty()));if (!_q1.empty())return _q1.back();elsereturn _q2.back();}protected:queue<T> _q1;queue<T> _q2;};
2.
//第二種實現template<class T>class Stack{public:void Push(const T& x){if (!_q2.empty())_q2.push(x);else_q1.push(x);}void Pop(){if (!_q1.empty()){while (_q1.size() != 1){_q2.push(_q1.front());_q1.pop();}_q1.pop();}else{while (_q2.size() != 1){_q1.push(_q2.front());_q2.pop();}_q2.pop();}}T& Top(){if (!_q1.empty()){return _q1.back();}elsereturn _q2.back();}protected:queue<T> _q1;queue<T> _q2;};void Test1(){Stack<int> s1;s1.Push(1);s1.Push(2);s1.Push(3);s1.Push(4);s1.Push(5);s1.Pop();cout << s1.Top() << endl;s1.Pop();cout << s1.Top() << endl;//cout << s1.Size() << endl;s1.Push(6);cout << s1.Top() << endl;s1.Pop();cout << s1.Top() << endl;s1.Push(7);cout << s1.Top() << endl;s1.Pop();s1.Pop();s1.Pop();cout << s1.Top() << endl;}
本文出自 “小止” 部落格,請務必保留此出處http://10541556.blog.51cto.com/10531556/1767625
兩個隊列實現一個棧