五.我遇到了迴圈佇列,忍不住對它進行了一番解剖
迴圈佇列是什麼?
就是一個將自己的尾指標指向的位置為自己的頭指標元素,就是將自己的要插入的元素放在了對列的首部。
為什麼要有循壞對列?
在一個佇列指標中,隨著資料的插入,在尾指標上面的進行入棧操作,同時對於新元素的刪除,對頭指標指向的佇列元素進行出棧操作,這樣就是的佇列的動使得這個尾指標達到Q->rear==MAXSIZE上時,這個函式將無法入棧,同時用程式碼實現只是說是棧滿退出,其實這個是假棧滿,我們將這樣的現象我們稱為“假溢位”現象。
於是我們就需要將自己的尾指標指向的位置為自己的頭指標元素,就是將自己的要插入的元素放在了對列的首部進行操作,為什麼需要這樣呢?其實解決這樣“假溢位”的情況我可以總結為兩點:(1).是利用佇列元素的平移,判斷位置的空來將這個位置,這個操作我覺得是你輸入的數(假設為n)在這個佇列上迴圈遍歷n*(MAXSIZS-N)個次數。
顯然易見,採用這個迴圈佇列上解決了這個“假溢位”問題,因為佇列上真正實用的順序佇列是迴圈對列,但是又會遇到問題是由於入隊時尾指標向前追趕頭指標,出隊是頭指標向前追趕尾指標,故隊空和隊滿的頭尾指標均相等,我們沒有辦法實現front=rear來判斷佇列的空和滿
我們用圖來演示:
為了右效地區分佇列滿還是空,比較典型的有如下三種:
(1)多設一個邏輯變數存放佇列滿還是空。
(2)多使用一個整型變數做計數器來記錄佇列中元素的總數(即佇列長度)。
(3)少用一個元妻的空間,約定人隊前,測試尾指標在迴圈意義下加1後是否等於頭指標,若相等則認為隊消(注意:rear所指的單元始終為空)。
為了解決這一向題我們在本教材裡採用第三種方法,即規定迴圈佇列中始終留一個空的元素空間,就是我們設計的尾指標rear永遠沒有元素。我們稱這種方法為“隊尾立SnQueoe + Q
上隊首即為佇列滿”。因此迴圈佇列的空與滿狀態的判定可描述如下:
①隊空:Q-rear==Q->front
②隊滿:cQ->rear+I)% QUEUESIZE--Q->front。
一:佇列的初始化
`SqQueue* InitSqQueue() {
SqQueue* Q;
Q = (SqQueue*)malloc(sizeof(SqQueue));
if (!Q)
return NULL;
else
{
Q->front = Q->rear = 0;
return Q;
}
}
`
2.迴圈佇列的插入運算
int Push(SqStack* S, ElamType x) { if (S->top == STACKSIZE - 1){ printf("空間已滿,無法壓棧"); return ERROR; } else { S->top++; S->data1[S->top] = x; return OK; } }
3.迴圈佇列的出隊運算
int Pop(SqStack* S, ElamType *x) { if (S->top == STACKSIZE - 1) { printf("空間空,無法刪除"); return ERROR; } *x = S->data1[S->top]; S->top--; return OK; }