zoukankan      html  css  js  c++  java
  • 循环队列

    循环队列

    @

    1,循环队列

    队列的操作特点是“先进先出”。为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。

    img

    img

    2,C语言实现循环队列
    #include<stdio.h>
    #include<assert.h>
    #define SIZE 8
    typedef struct Queue
    {
    	int elem[SIZE];//数组
    	int front;//头
    	int rear;//尾
    }Queue,*QueueS;
    
    void InitQueueS(QueueS queue)           //初始化
    {
        asesrt(queue!=NULL);
        queue->front=0;
        queue->rear=0;
    }
    bool Push(QueueS queue,int val)         //入队
    {
        assert(queue!=NULL);
        if(IsFull(queue))
        {
         return false;
        }
        queue->elem[queu->rear]=val;
        queue->rear=(queue->rear+1)%SIZE;
        return true;
    }
    bool Pop(QueueS queue,int *rtv)       //出队
    {
        assert(queue!=NULL)
        if(IsEmpty(queue))
        {
            return false;
        }
        if(rtv!=NULL)
        {
            *rtv=queue->elem[queue->front];
        }
        queue->front=(queue->front+1)%SIZE;
        return true;
    }
    void Show(QueueS queue)
    {
        for(int i=queue->front;i!=queue->rear;i=(i+1)%SIZE)
        {
            printf("%d ",queue->elem[i]);
        }
        printf("
    ");
    }
    int GetLength(QueueS queue)      //获取长度
    {
        return (queue->rear-queu->front+SIZE)%SIZE;
    }
    bool IsFull(QueueS queue)        //判满
    {
        return (queue->rear+1)%SIZE==queue->front;
    }
    bool IsEmpty(QueueS queue)         //判空
    {
        return queue->front==queue->rear;
    }
    void Clear(QueueS queue)
    {
        queue->front=queue->rear;
    }
    void Destroy(QueueS queue)
    {
        Clear(queue);
    }
    
    3,OOP实现循环队列
    #include<iostream>
    using namespace std;
    class CQueue
    {
    public:
        CQueue(int size=10)
        {
            mfront=mrear=0;
            msize=size;
            mqueue=new int[msize];
        }
       /* CQueue(int size=10):mfront(0),mrear(0),msize(size)
        {
            mqueue=new int [msize];
        }
        */
        ~CQueue()
        {
            delete[]mqueue;
            mqueue=NULL;
        }
        CQueue(const CQueue&src)
        {
            mfront=src.mfront;
            mrear=src.mrear;
           mszie=src.msize;
            mqueue=new int [src.msize];
            for(int i=mfront;i!=mrear;i=(i+1)%msize)
            {
                mqueue[i]=src.mqueue[i];
            }
        }
        void operator=(const CQueue&src)
        {
            if(this==&src)
            {
                return ;
            }
            delete[]mqueue;
            mqueue=NULL;
            mfront=src.mfront;
            mrear=src.mrear;
            mszie=src.msize;
            mqueue=new int [src.msize];
            for(int i=mfront;i!=mrear;i=(i+1)%msize)
            {
                mqueue[i]=src.mqueue[i];
            }
        }
        void push(int val)
        {
            if(full())
            {
                return;
            }
            mqueue[mrear]=val;
            mrear=(mrear+1)%msize;
        }
        void pop()
        {
            if(empty())
            {
                return;
            }
            mfront=(mfront+1)%msize;
        }
        int front()
        {
            return mqueue[mfront];
        }
        int back()
        {
            if(mrear==0)
            {
                return mqueue[msize-1];
            }
            else
            {
                return mqueue[mrear-1];
            }
        }
        bool full()
        {
            return (mrear+1)%msize==mfront;
        }
        bool empty()
        {
            treturn mrear==mfront;
        }
        void show()
        {
            for(int i=mfront;i!=mrear;i=(i+1)%msize)
            {
                cout<<mqueue[i]<<" ";
            }
        }
     private:
        int*mqueue;
        int mfront;
        int mrear;
        int msize;
        void resize()
        {
            int *mtmp=new int[msize*2];
            for(int i=mfront,j=0;i!=mrear;i=(i+1)%msize,j++)
            {
                mtmp[j]=mqueue[i]
            }
            delete[]mqueue;
            mqueue=mtmp;
            mfront=0;
            mrear=msize-1;
            msize*=2;
        }
    };
    
  • 相关阅读:
    Vue.js学习 Item14 – 过滤器与自定义过滤器
    Vue.js学习 Item13 – 指令系统与自定义指令
    Vue.js学习 Item12 – 内部响应式原理探究
    redis配置文件redis.conf详细说明
    PhpStorm下Laravel代码智能提示
    laravel 5.0 artisan 命令列表(中文简体)
    阿里云CENTOS服务器挂载数据盘
    NGINX关于配置PATHINFO
    LINUX下导入、导出MYSQL数据库命令
    ECSTORE2.0 定时任务配置
  • 原文地址:https://www.cnblogs.com/earthmolin/p/9931442.html
Copyright © 2011-2022 走看看