迴圈佇列的順序儲存結構的實現(七)

2021-09-01 17:11:39 字數 3099 閱讀 8464

18.11.24

(基於c語言,歡迎指正)

是一種先進先出(fifo)的線性表,只允許在隊尾進行插入,在隊首進行刪除

順序儲存的佇列寫起來跟順序實現的棧很像,也是採用陣列儲存資料,但是在不斷入佇列和出佇列過程中,資料會不斷後移,所以會造成大量的空間浪費,所以這裡我們採用迴圈佇列的形式

我們需要知道,迴圈佇列也是採用的陣列的形式,並且有兩個標記位置的整型變數front和rear,其中,front等於隊首元素的下標,rear等於隊尾元素下乙個位置的下標

也就是說,開始時,迴圈佇列長這樣

此時,我們可以發現,迴圈隊列為空,front等於rear

然後我們不斷的入佇列

最終,迴圈佇列滿了,長這樣

我們發現front還是等於rear,於是我們無法通過front和rear判斷迴圈佇列是否滿了嗎?

我們可以不讓他滿,讓他差一點滿

像這樣

於是,如果出現front等於rear,那麼佇列就是空的

那怎麼判斷隊滿呢

先假設佇列最大長度為maxsize

maxsize這裡等於5

我們可以發現

當front>=rear

就是這樣

佇列的長度為rear-front=5-1=4

當front

就是這樣

那麼此時,佇列長度為rear-front+maxsize=1-2+5=4

所以,結合上面兩種情況,我們可以得出求迴圈佇列長度的通用公式

注意這裡是取餘符號%,不是除法

這個公式子在寫迴圈佇列的時候會經常用到,很重要!!!

那麼我們開始寫迴圈佇列

標頭檔案,迴圈佇列的規模,結點的設定,老生常談的東西了

#include#include#define maxsize 10  //迴圈佇列最多有10-1=9個元素

typedef int qelemtype;

typedef structsqqueue;

一開始

front=rear=0對吧

int initqueue(sqqueue *q)
我們按照上面的公式

( rear - front + maxsize ) % maxsize

**實現

int length(sqqueue *q)
我們需要判斷佇列滿的情況,即rear+1==front

**如下

int enqueue(sqqueue *q,qelemtype e)

q->data[q->rear]=e;

q->rear=(q->rear+1)%maxsize;//rear向後移動一位,若到最後則移動至陣列頭

return 1;

}

我們需要判斷佇列是否空,即rear!=front才能出佇列

int dequeue(sqqueue *q,qelemtype *e)

*e=q->data[q->front];

q->front=(q->front+1)%maxsize;

return 1;

}

有兩種情況,如果front>rear,我們就要分段列印

void print(sqqueue *q)

i=0;

while(i!=q->rear)

}else

}printf("\n");

}

一些迴圈佇列要用到的基本函式就寫完了,下面我們在主函式中進行除錯

#include#include#define maxsize 10

typedef int qelemtype;

typedef structsqqueue;

int initqueue(sqqueue *q)

int length(sqqueue *q)

int enqueue(sqqueue *q,qelemtype e)

q->data[q->rear]=e;

q->rear=(q->rear+1)%maxsize;

return 1;

}int dequeue(sqqueue *q,qelemtype *e)

*e=q->data[q->front];

q->front=(q->front+1)%maxsize;

return 1;

}void print(sqqueue *q)

i=0;

while(i!=q->rear)

}else

}printf("\n");

}int main()

printf("佇列長度為:%d \n",length(&q));

print(&q);

printf("輸入要刪除的元素個數(從隊首進行刪除)\n");

scanf("%d",&num);

for(int i=0;i結果如下

線性結構 迴圈佇列的順序儲存實現

僅供參考 有錯誤望指出 直接寫迴圈佇列 建立 入列 出列 遍歷 佇列的長度 例如清空,銷毀 之類的操作都沒有寫 以後的有時間再補充 一次聽課,看書時,都沒有懂,為什麼,加那麼多 求餘的,下面想想寫寫,沒有加注釋.會補上的.include include include define ok 1 def...

順序儲存結構的迴圈佇列

第一點 rear指向的是隊尾的下乙個元素 為了不讓rear此時指向的是front 會留個空 讓rear指向乙個空位 第二點 因為留了個空位 所以當你要插入k個元素的時候 你就要給這個順尋儲存結構陣列長度設為k 1 第三點 你在返回隊尾 計算長度等等進行加減運算 的時候都要記得取模 在返回rear的時...

佇列 迴圈佇列 的順序儲存實現

佇列的順序儲存實現 1 佇列 一端進,另一端出 佇列由兩個引數決定,front 頭 rear 尾 頭指標指向頭乙個元素,尾指標指向指向最後乙個元素的下一儲存單元 若陣列長度為n,當元素個數為n 1時就認為佇列已滿。r指向最後乙個空的元素空間。出隊 頭指標往上移動,入隊 尾指標向上移動,故 靜態佇列只...