数据结构之 循环队列

队: 定义只在线性表的队头(表头)删 队尾(表尾)增长;
数据的使用规则 First in First out (先进先出);FIFO规则
存储结构
typedef struct {数组

int data[MAXSIZE];
   int front;   //头指针;
   int rear;     //尾指针;

}squeue;指针

初始化一个空队列,同时指向开头;code

Status InitQueue (squeue *Q)
{队列

Q->front==0;
             Q->rear=0;
            return OK;

}
求队列长度
当rear大于front时,循环队列的长度:rear-frontit

当rear小于front时,循环队列的长度:分为两类计算 0+rear和Quesize-front即rear-front+Quesize(为负时以圈数抵消负号);
总的来讲,总长度是(rear-front+Quesize)%Quesizeio

int Queuelength(squeue Q)
{循环

return (Q.rear-Q.front+MAXSIZE) %MAXSIZE;

}queue

删除操做;
Status DeQueue (squeue Q, int e)
{链表

if(Q->front==Q->rear) //判段队列为空
              return ERROR;
              *e=Q->data[Q->front]; // 取出对应的值
              Q->front=(Q->front+1)%MAXSIZE; //front 后移一位;
              reuturn OK;

}
入队操做;
Status EnQueue (squeue *Q , int e)
{next

if(Q->rear+q)%MAXSIZE==Q->front ) /*队满的判段;
    Q->data[Q->rear]=e;
    Q->rear=(Q->rear+1)%MASIZE;
    return OK;

}

读到这相信很多的初级码农同志 出现了
这是啥 ???
我再哪里???
我是谁 ???
让我来解释一下 几个关键点

1 quesetion 为何以数组的结构能实现循环操做 ?
answer the question :
关键再于 %运算和指针的移动操做 , 不管是 Q->front, Q->rear ++ 它们都可表示为 nMAXSIZE + I n(0,1,2....n) I (1,2,...MAXSIZE) ;
Q->rear=(Q->rear+1)%MASIZE;
Q->rear=(Q->rear+1)%MASIZE;
支持循环的实现;

2 question 判空 和 判满;answer the question :再顺序表中 if(Q->front==Q->rear) //判段队列为空链表中就是 front->next=rear->next==NULL; (指针 front rear);循环队列的判满的条件;Q->front==Q->rear 也可做为判满的条件 (逆向追上front);因此咱们有两种解决办法;法一;设置 MAXSIZE 大小的位置使用MAXSIZE-1 大小 将 rear 与 front 的实际差始终固定为一个单元, 即始终逆向追上front;法二在尾设置一个,tag 初始化尾 tag=0 当 第一次到 MAXSIZE 的时候就 tag=1 ,在此后的每一次的 为空时使 tag=0;

相关文章
相关标签/搜索