队: 定义只在线性表的队头(表头)删 队尾(表尾)增加;
数据的使用规则 First in First out (先进先出);FIFO规则
存储结构
typedef struct {
int data[MAXSIZE];
int front; //头指针;
int rear; //尾指针;
}squeue;
初始化一个空队列,同时指向开头;
Status InitQueue (squeue *Q)
{
//初始化Q->front 与Q->rear 同时指向数组的下标为0的位置
Q->front==0;
Q->rear=0;
return OK;
}
求队列长度
当rear大于front时,循环队列的长度:rear-front
当rear小于front时,循环队列的长度:分为两类计算 0+rear和Quesize-front即rear-front+Quesize(为负时以圈数抵消负号);
总的来说,总长度是(rear-front+Quesize)%Quesize
int Queuelength(squeue Q)
{
return (Q.rear-Q.front+MAXSIZE) %MAXSIZE;
}
删除操作;
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)
{
if(Q->rear+1)%MAXSIZE==Q->front ) /*队满的判段;
return ERROR;
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) //判段队列为空
链表中就是 Q->front->next=Q->rear->next==NULL; (指针 front rear);
循环队列的判满的条件;
Q->front==Q->rear 也可作为判满的条件 (逆向追上front);
所以我们有两种解决办法;*
法一;
设置 MAXSIZE 大小的位置使用MAXSIZE-1 大小 将 rear 与 front 的实际差始终固定为一个单元, 即始终逆向追上front;
法二
在尾设置一个,tag 初始化尾 tag=0 当 第一次到 MAXSIZE 的时候就 tag=1 ,在此后的每一次的 为空时使 tag=0;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。