1. 程式人生 > >佇列的基礎知識及實現方法

佇列的基礎知識及實現方法

佇列

 

在網上又看到關於佇列的知識點,有很多,但都比較瑣碎,有的還有些錯誤,為方便自己理解,特整理出一篇,順便也加強記憶;當然,也附上我參考的部落格地址:

http://www.cnblogs.com/kaituorensheng/archive/2013/02/28/2937865.html點選開啟連結

佇列定義:佇列屬於先進先出型,First in first out(FIFO)

佇列是一種特殊的線性表,只能在前端(front)進行刪除操作,只能在後端(rear)進行插入操作;

佇列分為順序佇列和迴圈佇列;

順序佇列:

每次插入,指標rear加一,每次刪除,指標front加一;

 

迴圈佇列:

初始化時,rear = front=0,當佇列不為空時,front指向佇列中的第一個元素,rear指向佇列中最後一個元素的下一個位置,當佇列滿時 rear=front,但不一定是位置0;

插入後rear+1,刪除後front+1,但是,無論是刪除還是插入,一旦rear或front加一超過了所分配的空間,則讓指標指向這片空間的起始位置;設所分配的空間為Maxsize,一旦rear+1,或front+1 =Maxsize, 則rear或front指向起始位置;如上圖,當front和rear都在位置3事,此時如果想要插入,則判斷3+1=4 與Maxsize 4的關係,相等,則rear=0,這個可以通過取餘實現,rear=(rear+1)%Maxsize;

因此,迴圈序列判空的方法是rear = front; 判滿的方法是 (rear+1)%Maxsize ==front;

進佇列步驟: 1.判斷佇列是否滿,即,rear+1是否等於front,若等於則佇列已滿,不允許進入;2. 若不滿,則將值儲存至rear+1的位置 ; 從這裡也可以看出,迴圈數列所能儲存的值其實是Maxsize-1, 如上圖所示, maxsize是4, 若front =0, rear =3,這時位置3為空,但是判斷的3+1 =4,則rear=(rear+1)%4 =0,則rear = front,顯示佇列已滿,所以不能再插入,而其實還有一個空位。

void EnQueue(Queue *Q, int key)
{

        if ( (Q->rear+1) % Q->maxsize == Q->front)                   //此時佇列沒有空間       取餘保證,當quil=queuesize-1時,再轉回0
        {
            printf("the queue has been filled full!");
        }
        else
        {
          Q->q[Q->rear] = key;

            Q-> rear =(Q->rear+1) % Q->maxsize;
        }
}

出佇列步驟:1.判斷數列是否為空; 2, 將front現在的時間表儲存至temp; 3,將front指標後移一個;4. 返回temp;

int DeQueue(Queue *Q)
{
        int tmp;
        if(Q->rear== Q->front)     //判斷佇列不為空
        {
            printf("the queue is NULL\n");
        }
        else
        {
            tmp = Q->q[q->front];
            Q->front= (Q->front+1) % Q->maxsize;
        }
        return tmp;
}