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


黑白
144 声望0 粉丝