[原创] 用两个queue实现stack的功能

#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。

posted on 2016-03-23 22:04  qmzp  阅读(665)  评论(0编辑  收藏  举报

导航