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

隊列


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

http://www.cnblogs.com/kaituorensheng/archive/2013/02/28/2937865.html點擊打開鏈接


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

隊列是一種特殊的線性表,只能在前端(front)進行刪除操作,只能在後端(rear)進行刪除操作;隊列分爲順序隊列和循環隊列;

順序隊列:

每次插入,指針rear加一,每次刪除,指針front加一;(放一張百度的圖片)

在第四步中,front=rear,隊列雖然判爲空,卻不能夠再進行使用,因此造成了內存的浪費;所以就有了循環隊列;

循環隊列:

初始化時,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的位置 ; 從這裏也可以看出,循環數列所能存儲的值其實是最大值-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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章