數據結構之 循環隊列

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

相關文章
相關標籤/搜索