4.10 佇列的定義
佇列定義:一種先進先出的線性表。允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭。
隊頭 隊尾
出佇列 a1 a2 a3 a4 ..... an 入佇列
佇列有類似線性表的各種操作,不同的就是插入資料只能在隊尾進行,刪除資料只能在隊頭進行。
線性表有線性儲存和鏈式儲存。棧是線性表,有這兩種儲存方式。
佇列作為一種特殊的線性表,也有這兩種儲存方式。先看佇列的線性儲存結構。
4.12 迴圈佇列
4.12.1 佇列順序儲存的不足
為了避免當只有乙個元素時,隊頭和隊尾重合使處理變得麻煩,所以引入兩個指標,front指標指向隊頭元素,rear指標指向隊尾元素的下乙個位置,這樣當front等於rear時,此佇列不是還剩乙個元素,而是空佇列。(刪除)
假溢位:假設這個佇列的總個數不超過5個,但目前如果接著入隊的話,因陣列末尾元素已經占用,再向後加,就會產生陣列越界的錯誤,可實際上,我們的佇列在下標為0和1的地方還是空閒的。這種現象「假溢位」。
4.12.2 迴圈佇列的定義
所以假溢位的問題就是後面滿了就再從頭開始,也就是頭尾相接的迴圈。
把佇列的這種頭尾相接的順序儲存結構稱為迴圈佇列。
(1)此時問題是,我們剛才說,空佇列時,front等於rear時,現在當佇列滿時,也是front等於rear,那麼如何判斷此時的佇列究竟是空還是滿?(元素入隊)
(2)辦法一設定乙個標誌變數flag,當front == rear,且flag = 0時為佇列空,當front == rear,且flag = 1時為佇列滿。
(3)辦法二是當佇列空時,條件就是front == rear,當佇列滿時,我們修改其條件,保留乙個元素空間。也就是說,佇列滿時,陣列中還有乙個空閒單元。
重點討論第二種方法,由於rear的值可能比front大,也可能比front小,所以儘管他們只相差乙個位置時就是滿的情況,但也有可能相差整一圈。
所以佇列滿的條件是 (rear+1)%陣列長度 == front 取模的目的就是為了整合rear和front大小為乙個問題。
通用的計算佇列長度的公式:
(rear - front + 陣列長度)% 陣列長度
迴圈佇列實現**如下:
#include
#include
#include
//巨集定義陣列長度
#define length 6
//迴圈佇列的順序儲存結構
typedef struct qqueue
queue, *pqueue;
//函式宣告
//初始化空佇列
void init_queue(pqueue list);
//佇列滿判斷
bool full_queue(pqueue list);
//入隊操作
bool en_queue(pqueue list,int val);
//佇列空操作
bool empty_queue(pqueue list);
//出隊操作
bool de_queue(pqueue list,int *val);
//遍歷輸出
void tranverse_queue(pqueue list);
//返回佇列元素個數
int num_queue(pqueue list);
int main(void)
else
tranverse_queue(&list);
num = num_queue(&list);
printf("佇列的元素個數num = %d.\n",num);
return 0;
}//初始化乙個空佇列,陣列的長度length放這裡也不合適
void init_queue(pqueue list)
else
return ;
}//佇列滿的判斷
bool full_queue(pqueue list)
else
}//入隊
bool en_queue(pqueue list,int val)
else
}//佇列遍歷輸出
void tranverse_queue(pqueue list)
printf("\n");
}//判斷隊列為空
bool empty_queue(pqueue list)
else
}//出隊
bool de_queue(pqueue list,int *val)
else
}//返回佇列元素個數
int num_queue(pqueue list)
出自:大話資料結構、嚴蔚敏老師之 資料結構
資料結構之迴圈佇列
資料結構之佇列 迴圈佇列 ide vs2010 佇列操作 初始化 入隊 插入隊尾 出隊 即取隊頭 判斷佇列是否非空 滿 include using namespace std define max len 100 定義節點型別 typedef struct queue queue 初始化 void ...
資料結構之迴圈佇列
怎麼理解上面這段話呢?就是說在現實生活的數個人排隊辦理業務,辦完業務的人自然就走了,後邊的人會往前頂。但是在程式設計中,是死的,他不會自動往前頂。因而迴圈佇列就出現了。其實就是像上段話說的解決 中資料不會自動往前頂,會出現前邊已經空了,但是插不進資料的問題。怎麼解決的呢?資料不會往前頂,但是尾部指標...
資料結構之迴圈佇列
迴圈佇列 我們在佇列的基礎上,將順序佇列臆造為乙個環狀的空間,稱為迴圈佇列 迴圈佇列最重要的判別式是所有判別位置時都必須對最大儲存空間進行取餘操作 輸入三個資料進行測試。例 1 2 3。include include define false 0 define ok 1 define maxsize...