zoukankan      html  css  js  c++  java
  • [原创] 用两个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。

  • 相关阅读:
    蓝牙的发展史及版本演进
    linux下tar.bz2文件的 解压缩方法
    一个简单的C语言题背后的故事
    thinkpad的E480安装ubuntu后wifi无法使用问题解决
    Linux 上的常用文件传输方式介绍与比较
    一个linux内核编译时遇到的perl语法导致的编译问题解决
    自省是最好的导师
    ....................................thinkpad E480 用户初体验..............................
    使用diskpart命令格式化U盘
    了解甚少的GNU C的__attribute__ 机制
  • 原文地址:https://www.cnblogs.com/lifeinsmile/p/5313334.html
Copyright © 2011-2022 走看看