循环队列

循环队列

@

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;
    }
};
原文地址:https://www.cnblogs.com/earthmolin/p/9931442.html