文章首發於 2020-10-15 知乎文章:資料結構(c語言)-迴圈佇列基本操作
佇列是一種先進先出(first in first out,fifo)的線性表,是一種常用的資料結構。
它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇列。
圖1 佇列
佇列有很多種,按照儲存結構劃分,有鏈式佇列,迴圈佇列,單向佇列,雙端佇列。實現佇列的方式也有很多種,如基於鏈式儲存結構的鏈結佇列(又稱鏈佇列),基於順序儲存結構的佇列。
本文介紹基於陣列(一種順序儲存結構)的迴圈佇列的實現和一些基本操作,並用**的形式講解
佇列的順序儲存結構和順序棧類似
在佇列的順序儲存結構中,除了用一組位址連續的儲存單元依次存放從佇列頭到佇列尾的元素之外,還需要設定頭尾兩個指標front和rear,分別指示佇列頭元素及隊尾元素的位置
我們規定
圖2 佇列的順序儲存結構
在入隊和出隊的操作中,頭尾指標只增加不減小,致使被刪除元素的空間永遠無法重新利用,因此,儘管佇列中實際的元素個數遠遠小於向量空間的規模,但也可能由於尾指標巳超出向量空間的上界而不能做入隊操作,該現象稱為假溢位
解決辦法:將順序佇列臆造為乙個環狀的空間,稱之為迴圈佇列
迴圈佇列的結構如下圖所示
圖2 迴圈佇列
以下**,實現了乙個可以儲存學生學號(最長12位的字串)迴圈佇列,基於陣列這種順序儲存結構,,實現了它的初始化,出隊,入隊,佇列銷毀的操作
#include#include#include#define ok 1
#define no 0
#define maxsize 100
//迴圈佇列結構
typedef struct loopqueueloopqueue;
//迴圈佇列初始化。該迴圈佇列基於陣列,因此一旦宣告乙個loopqueue變數
//其內部的base陣列空間便自動分配,不需要自己分配
//只需初始化隊頭和隊尾索引
int initlqueue(loopqueue *q)
//返回長度
int getlenth(loopqueue *q)
//插入元素
int insertlqueue(loopqueue *q)
//元素出隊
char* outlqueue(loopqueue *q)
//銷毀佇列,也是由於該迴圈佇列基於陣列,不需要分配記憶體
//只需重置隊頭和隊尾索引即可
int destroylqueue(loopqueue *q)
int main()
break;
case 3:
back = outlqueue(&q);
back? printf("------------\n 元素: %s 出隊,還剩%d個元素\n",back,getlenth(&q)):printf("------------\n隊列為空,無法出隊!\n");
break;
case 4:
destroylqueue(&q)?printf("------------\n佇列銷毀成功!\n"):printf("------------\n佇列銷毀失敗!\n");
break;
case 0:
printf("\n-->> 退出\n");
exit(0);
break;
default:
break;
}}while(choice);
}
以上**經過除錯,我自認為沒有問題(鄙人才疏學淺,歡迎指正) 資料結構 迴圈佇列 C語言
2 迴圈佇列源 及測試 佇列,顧名思義就像我們平時排隊打飯一樣,隊尾有人不斷來排隊打飯,隊頭不斷有人打完飯離開隊頭 順序佇列用順序儲存結構,即陣列儲存,分別包含倆個變數front和rear分別代表隊頭和隊尾,為了防止陣列越界溢位,我們將順序佇列變成乙個環狀的空間,即迴圈佇列,超出陣列界隊尾重新回到陣...
資料結構 迴圈佇列的基本操作
initqueue q 初始化佇列q queueempty 判斷佇列是否為空 enqueue e 將元素e 放入隊尾 dequeue e 移走隊頭元素,由 e帶回該元素的值 getfront 獲取隊頭元素的值,但不從佇列中移走該元素 length 計算並返回佇列中元素的個數 include incl...
資料結構(C語言) 鏈佇列基本操作
文章首發於2020 10 15 知乎文章 資料結構 c語言 鏈佇列基本操作 佇列是一種先進先出 first in first out,fifo 的線性表,是一種常用的資料結構。它只允許在表的前端 front 進行刪除操作,而在表的後端 rear 進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。...