队: 定义只在线性表的队头(表头)删 队尾(表尾)增长;
数据的使用规则 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;