#include <iostream> #include <queue> using namespace std; template <class T> class doubleQueueToStack { private: queue<T> queueA; queue<T> queueB; bool flag = true; // flag True, queueA is active public: void push(T elemet); void pop(); }; template <class T> void doubleQueueToStack<T>::push(T element){ if(flag == true){ queueA.push(element); cout <<element << " push to queueA" <<endl; } else{ queueB.push(element); cout <<element << " push to queueB" <<endl; } } template <class T> void doubleQueueToStack<T>::pop() { if(doubleQueueToStack::flag==true){ if(doubleQueueToStack::queueA.empty()){ cout << "no element to pop....." << endl; return; } int n= doubleQueueToStack::queueA.size(); for(int i = 0; i<n-1; i++){ ///(##a) doubleQueueToStack::queueB.push(queueA.front()); doubleQueueToStack::queueA.pop(); } cout <<"pop: " << doubleQueueToStack::queueA.front() <<endl; doubleQueueToStack::queueA.pop(); doubleQueueToStack::flag = false; } else{ if(doubleQueueToStack::queueB.empty()){ cout << "no element to pop....." << endl; return; } int n= doubleQueueToStack::queueB.size(); for(int i = 0; i < n-1; i++){ ///(##b) //cout << doubleQueueToStack::queueB.front() << endl; doubleQueueToStack::queueA.push(doubleQueueToStack::queueB.front()); doubleQueueToStack::queueB.pop(); } cout << "pop : " << doubleQueueToStack::queueB.front() <<endl; doubleQueueToStack::queueB.pop(); doubleQueueToStack::flag = true; } } int main() { doubleQueueToStack<double> queueDD; queueDD.push(11); queueDD.push(22); queueDD.push(33); queueDD.pop(); queueDD.push(44); queueDD.pop(); queueDD.pop(); queueDD.pop(); queueDD.pop(); return 0; }
注意,语句(a)(b)处不能用以下语句代替:
for(int i = 0; i<doubleQueueToStack::queueA.size()-1; i++){ ////!!!!! 错误!!!!! doubleQueueToStack::queueB.push(queueA.front()); doubleQueueToStack::queueA.pop(); }
queueA.size是unsigned类型(size_type), 直接进行运算会出问题,
上述语句执行结果,比正确结果少一次queueA.pop。