• 日常编程练习(四)


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

    一、两个栈实现队列

    只要考虑一个栈作为输入,另一个栈作为输出即可

    template <typename T>
    class CQueue
    {
    public:
        CQueue(void){};
        ~CQueue(void){};
    
        void appendTail(const T&);
        T deleteHead();
    
    private:
        stack<T> stack1;
        stack<T> stack2;
    } ;
    
    template <typename T>
    void CQueue<T>::appendTail(const T& node)
    {
        stack1.push(node);
    }
    
    template <typename T>
    T CQueue<T>::deleteHead()
    {
        if(stack2.empty()&&stack1.empty())
            return -1;
        T res;
        if(stack2.empty())
        {
            while(stack1.size()>1)
            {
                stack2.push(stack1.top());
                stack1.pop();
            }
            res=stack1.top();
            stack1.pop();
        }
        else
        {
            res=stack2.top();
            stack2.pop();
        }
        return res;
    }

    二、两个队列实现栈

    两个队列无论怎么转换先进先出的顺序是不会改变的,所以队顶的数永远是最后输出,因而每次输入直接加到有值队列即可,输出时获取有值队列最后一个值,并将之前的转换到另一个队列。

    template <typename T>
    class Cstack
    {
    public:
        Cstack(void){}
        ~Cstack(void){}
        void Cpush(const T&);
        void Cpop();
        T Ctop();
    
    private:
        queue<T> queue1;
        queue<T> queue2;
    };
    
    template <typename T>
    void Cstack<T>::Cpush(const T& data)
    {
        if(!queue2.empty())
            queue2.push(data);
        else
            queue1.push(data);
    }
    
    template <typename T>
    void Cstack<T>::Cpop()
    {
       if(queue1.empty()&&queue2.empty())
            return;
       if(!queue1.empty())
        {
            while(queue1.size()>1)
            {
                queue2.push(queue1.front());
                queue1.pop();
            }
            queue1.pop();
        }
        else if(!queue2.empty())
        {
            while(queue2.size()>1)
            {
                queue1.push(queue2.front());
                queue2.pop();
            }
            queue2.pop();
        }
    }
    
    template <typename T>
    T Cstack<T>::Ctop()
    {
        if(queue1.empty()&&queue2.empty())
            return -1;
        T res;
        if(!queue1.empty())
        {
            while(queue1.size()>1)
            {
                queue2.push(queue1.front());
                queue1.pop();
            }
            res=queue1.front();
            queue2.push(queue1.front());
            queue1.pop();
        }
        else if(!queue2.empty())
        {
            while(queue2.size()>1)
            {
                queue1.push(queue2.front());
                queue2.pop();
            }
            res=queue2.front();
            queue1.push(queue2.front());
            queue2.pop();
        }
        return res;
    }
  • 相关阅读:
    leetcode 2 Add Two Numbers
    log4j2 springboot 特点与使用方法
    数据类型和运算符
    初识Java
    《梦断代码》阅读笔记02
    《梦断代码》阅读笔记01
    场景调研
    【站立会议】第九天
    【站立会议】第八天
    【站立会议】第七天
  • 原文地址:https://www.cnblogs.com/kiplove/p/6825390.html
Copyright © 2020-2023  润新知