• 用两个栈模拟一个队列


    栈是后进先出,队列是先进先出。

    插入元素时,向栈stack1插入,比如插入a,b,c。

    现在模拟取出元素,如果直接从stack1中pop,这时会弹出c。我们可以从stack1中把所有元素pop,放入stack2中,这时候stack2中是c,b,a。这时对stack2进行pop操作,取出的就是a了,stack2现在元素为c,b。这时在考虑向队列中插入d,向stack1中放入d,然后队列进行pop操作,stack2.pop(),取出b,符合实际。再一次进行pop,stack2弹出c,再次弹出,stack1弹出d,插入stack2中,stack2再次pop,弹出d。符合队列的先进先出。

    参考代码如下:

    #include <iostream>
    #include <stack>
    #include <exception>
    
    using namespace std;
    
    template <typename T> class CQueue
    {
    public:
        CQueue(){};
        ~CQueue(){};
        T top();//取出队首元素
        void pop();//删除操作
        void push(const T& t);//插入操作
    private:
        stack<T> stack1;
        stack<T> stack2;
    
    };
    
    template <typename T>
    void CQueue<T>::push(const T& t){
        stack1.push(t);
    }
    
    template <typename T>
    T CQueue<T>::top()
    {
        if( stack2.empty()){
            while( !stack1.empty() ){
                T& data = stack1.top();
                stack1.pop();
                stack2.push(data);
            }
        }//如果stack2为空,则将stack1中元素全部弹出到stack2中
        try{
            if(stack2.empty())
                throw  exception("queue is empty");
            T head = stack2.top();
            return head;
        }catch(exception& c){
            cerr<<c.what()<<endl;
        }
    }
    
    template <typename T>
    void CQueue<T>::pop()
    {
        if( stack2.empty()){
                while( !stack1.empty() ){
                    T& data = stack1.top();
                    stack1.pop();
                    stack2.push(data);
                }
            }
            try{
                if(stack2.empty())
                    throw  exception("queue is empty");
                stack2.pop();
            }catch(exception& c){
                cerr<<c.what()<<endl;
            }
    }
    
    int main()
    {
        char a;
        CQueue<char> c1;
    
        c1.top();//测试用例1,对空队列进行删除和插入操作
        c1.push('a');
        c1.push('b');//测试用例2,对非空队列进行插入删除操作
        c1.push('c');
        a=c1.top();
        c1.pop();
        c1.push('d');
        c1.pop();
        c1.pop();
            c1.pop();//测试用例3,连续删除元素直至队列为空
        return 0;
    }
  • 相关阅读:
    转载 cglib代理和java代理
    解决流不能重复使用
    @RestController的方法中 路径参数带.(点号)配置
    Spring中application*的使用
    转载自用学习 侵权删
    转载学习 多线程中的内存模型和关键字
    转载 幂等的使用
    转载学习 关于线程池
    FastJSON 转换List<T> ,Map<T,T>泛型失败 处理方法
    quartz报错 Couldn't retrieve job because the BLOB couldn't be deserialized: null
  • 原文地址:https://www.cnblogs.com/yitianke/p/3031430.html
Copyright © 2020-2023  润新知