• 两个栈实现一个队列


    参考:http://www.cnblogs.com/wanghui9072229/archive/2011/11/22/2259391.html

    1.方法1(基本方法)

    这个时候把s2当做是一个缓冲栈。

    入队:将数据压入栈s1.

    出队:将栈s1中的数据弹出,再压入栈s2中,出栈的时候,弹出s2栈顶的数据。接下来,再将s2数据倒入s1中。(所以每次出栈完后,s2都是空的,因为s2只是缓冲栈)

    如下图:

    image

    2.方法2 (变种1)---此方法其实就是每次出队后,不是马上让s2数据倒入s1.适用于出队比较频繁的操作。

    入队 :先判断s1是否为空,如不为空,说明所有元素都在s1,此时将入队元素直接压入s1;如为空,要将s2的元素逐个“倒回”s1,再压入入队元素。

    出队: 先判断s2是否为空,如不为空,直接弹出s2的顶元素并出队;如为空,将s1的元素逐个“倒入”s2,把最后一个元素弹出并出队。

    3.方法3(最优法)

    入队: 将数据压入栈s1

    出队:如果(写代码的时候用if)s2不为空,此时是先进来的数据,所以直接出栈,若s2为空(写代码的时候用if),将s1数据压入s2中,再弹出栈顶数据。

    核心代码如下:

    template <typename T> 
    class CQueue
    {
        public:
            CQueue();
            ~CQueue();
    
            void Enqueue(const T & element);
            T Dequeue();
    };
    template <typename T>
    void Enqueue(const T & element)
    {
        stack1.push(element);
    }
    
    template <typename T>          //每次定义一个模板类 都要重复写一遍
    T CQueue<T>::Dequeue()         //类模板外定义成员函数,<T>不能少。
    {
        T element;
        //当s2为空的时候,将s1倒入s2
        if (stack2.size()==0)
        {
            while(stack1.size()>0)
            {
                element=stack1.top();
                stack1.pop();
                stack2.push(element);
            }
        }
        
        if (stack2.size()==0)
            throw new exception("queue is empty!");
        //当s2 不为空的时候,直接将s2栈顶元素出栈
        element=stack2.top();
        stack2.pop();
    
        return element;
    }
  • 相关阅读:
    倍数求和
    最大(小)值
    数组扁平化:(多维数组 -> 一维数组)
    任意数求和
    找到重复最多项
    Linux 标准 I/O 库
    Linux文件操作函数
    Linux文件的IO操作 一
    Linux文件系统概述二
    Linux文件系统概述
  • 原文地址:https://www.cnblogs.com/menghuizuotian/p/3773581.html
Copyright © 2020-2023  润新知