zoukankan      html  css  js  c++  java
  • 数据结构笔记-----队列

    队列的定义


    现实生活中的排队

    队列的性质



    队列的顺序存储实现


    代码复用:




    队列的链式存储实现


    代码复用:





    小结



    队列的优化实现

    顺序队列的瓶颈



    顺序队列的优化方案


    队列的顺序优化实现










    链式队列的瓶颈


    链式队列的优化方案



    代码









    小结


    效率提高,实现复杂度也提高了



    队列的特别实现

    栈与队列



    算法框架


    代码







    小结



    思考:




    两个队列实现栈

    题目:用两个栈实现一个队列。队列的生命如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。


    template <typename T>class CQueue
    {
    public:
      CQueue(void);
      ~CQueue(void);
      void appendtail(const T& node);
      T deleteHead();
    private:
      stack<T> stack1;
      stack<T> stack2;

    };

    解题思路:

    插入操作在stack1中进行,删除操作在stack2中进行,如果stack2为空,则将stack1中的所有元素转移到stack2中。

    代码实例:

    解法:



    1. 有两个队列q1和q2,先往q1内插入a,b,c,这做的都是栈的push操作。
    2. 现在要做pop操作,即要得到c,这时可以将q1中的a,b两个元素全部dequeue并存入q2中,这时q2中元素为a,b,对q1再做一次dequeue操作即可得到c。
    3. 如果继续做push操作,比如插入d,f,则把d,f插入到q2中,
    4. 此时若要做pop操作,则做步骤2
    5. 以此类推,就实现了用两个队列来实现一个栈的目的。

    注意在此过程中,新push进来的元素总是插入到非空队列中,空队列则用来保存pop操作之后的那些元素,那么此时空队列不为空了,原来的非空队列变为空了,总是这样循环。

    对于push和pop操作,其时间为O(n).

    #include<iostream>
    #include<stdlib.h>
    #include<stack>
    #include<queue>
    using namespace std;


    template <typename T>class CStack
    {
    public:
        CStack(void){};
        ~CStack(void){};
        void push(const T& node);
        T pop();
    private:
        queue<T> queue1;
        queue<T> queue2;
        
    };


    //插入元素
    template <typename T> void CStack<T>::push(const T& element)
    {
        if(queue1.size()>0)//如果queue1不为空则往queue1中插入元素
            queue1.push(element);
        else if(queue2.size()>0)//如果queue2不为空则往queue2中插入元素
            queue2.push(element);
        else//如果两个队列都为空,则往queue1中插入元素
            queue1.push(element);
            
    }


    //删除元素
    template <typename T> T CStack<T>::pop()
    {
        if(queue1.size()==0)//如果queue1为空
        {
            while(queue2.size()>1)//保证queue2中有一个元素,将其余元素保存到queue1中
            {
                queue1.push(queue2.front());
                queue2.pop();
            }
            T& data=queue2.front();
            queue2.pop();
            return data;
        }
        else//如果queue2为空
        {
            while(queue1.size()>1)//保证queue2中有一个元素,将其余元素保存到queue1中
            {
                queue2.push(queue1.front());
                queue1.pop();
            }
            T& data=queue1.front();
            queue1.pop();
            return data;
        }


    }




    void main()
    {
        CStack<int> stack;
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);


        int len=4;
        while(len>0)
        {
            cout<<stack.pop()<<" ";
            --len;
        }


        system("pause");
    }















  • 相关阅读:
    Mac上的USB存储设备使用痕迹在新版操作系统有所变化
    Beware of the encrypted VM
    A barrier for Mobile Forensics
    Second Space could let suspect play two different roles easily
    Take advantage of Checkra1n to Jailbreak iDevice for App analysis
    Find out "Who" and "Where"
    Where is the clone one and how to extract it?
    Downgrade extraction on phones running Android 7/8/9
    高版本安卓手机的取证未来
    How to extract WeChat chat messages from a smartphone running Android 7.x or above
  • 原文地址:https://www.cnblogs.com/Zyf2016/p/6337837.html
Copyright © 2011-2022 走看看