隊: 定義只在線性表的隊頭(表頭)刪 隊尾(表尾)增長;
數據的使用規則 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;