在邏輯上把順序儲存的佇列想象成乙個環,就是迴圈佇列。
迴圈佇列仍是順序儲存,只是元素可以迴圈儲存在給定的儲存空間。
前篇文章,順序儲存佇列基本操作 所描述的佇列的儲存空間只可以使用一次,在一些元素出隊之後,空出來的空間沒有辦法再次儲存,造成浪費,所以更多選擇迴圈佇列。
兩者的記憶體中的儲存一樣,只是邏輯上將兩者分為了非迴圈和迴圈。
判空和判滿可以有多種方式,根據自己的設計選擇即可。
第一種方式:
判空:當首尾指標指向同一位置時,隊列為空。
判滿:當尾指標+1 = 首指標,佇列已滿。
(這種方式是犧牲乙個儲存空間來判斷佇列是否已滿)
注意:判滿時 需要對maxsize取餘,否則rear可能超出maxsize。
第二種方式:
單獨設定乙個length變數,來儲存佇列的長度
判空:length = 0
判滿:length = maxsize
前篇文章,順序儲存佇列基本操作 就是利用length判斷長度
第三種方式
設定乙個tag引數 tag=1 時隊滿;tag= 0 時對空。
判空:當首尾指標指向同一位置時,隊列為空。
判滿:tag=1 時隊滿;tag= 0 時對空。
length = (rear + maxsize - front)%maxsize;
/**
* 迴圈佇列的基本操作
*/#include
#define maxsize 6
//定義佇列中元素的最大個數
/** * 定義結構
*/typedef
struct
sqqueue;
/** * 初始化佇列,構造乙個空的佇列
*/void
initqueue
(sqqueue &q)
/** * 判斷佇列是否為空
*/bool queueisempty
(sqqueue q)
else
}/**
* 入隊操作
* @param q
* @param value 入隊的值
*/void
enqueue
(sqqueue &q,
int value)
q.data[q.rear]
= value;
//隊尾指標指向新入隊的資料
q.rear =
(q.rear+1)
%maxsize;
//rear指標+1 ,此處求餘目的是不超出給定的maxsize
}/**
* 出隊操作,返回出隊元素
* @param q
*/int
outqueue
(sqqueue &q)
int x = q.data[q.front]
;//要出隊的元素
q.front =
(q.front+1)
%maxsize;
//首指標後移一位
return x;
}/**
* 讀隊頭元素,並返回
* @return
*/int
gethead
(sqqueue q)
/** * 建立完整佇列
* @param q
*/void
creatqueue
(sqqueue &q)
scanf
("%d"
,&x);}
}/**
* 列印
* @return
*/void
print
(sqqueue q)
/** * 由於是迴圈儲存資料,rear指標可能指向2的位置,
* front指標指向5的位置(這種情況是尾指標跑到了首指標前面,會出現負數)
* 負數不能取餘,所以+maxsize,保證資料的正確,取余會把加的maxsize再去掉
*/int length =
(q.rear+maxsize - q.front)
%maxsize;
printf
("佇列length %d \n"
,length);}
intmain()
--
----
--建立完整佇列(入隊)--
-------
1213
1415
1617
189999
----
----列印--
-------
佇列中儲存的值 12
佇列中儲存的值 13
佇列中儲存的值 14
佇列中儲存的值 15
佇列中儲存的值 16
佇列中儲存的值 17
佇列中儲存的值 18
佇列length 7
----
----獲取隊頭元素--
-------
隊頭元素 -
12--
----
--出隊--
-------
出隊元素 -
12--
----
--獲取隊頭元素--
-------
隊頭元素 -
13
順序儲存佇列基本操作: 佇列 順序儲存結構,迴圈佇列
為什麼小甲魚上節課說佇列的實現上我們更願意用鏈式儲存結構來儲存?我們先按照應有的思路來考慮下如何構造佇列的順序儲存結構,然後發掘都遇到了什麼麻煩。我們假設乙個佇列有n個元素,則順序儲存的佇列需建立乙個大於n的儲存單元,並把佇列的所有元素儲存在陣列的前n個單元,陣列下標為0的一端則是隊頭。no pic...
佇列 迴圈佇列 的順序儲存實現
佇列的順序儲存實現 1 佇列 一端進,另一端出 佇列由兩個引數決定,front 頭 rear 尾 頭指標指向頭乙個元素,尾指標指向指向最後乙個元素的下一儲存單元 若陣列長度為n,當元素個數為n 1時就認為佇列已滿。r指向最後乙個空的元素空間。出隊 頭指標往上移動,入隊 尾指標向上移動,故 靜態佇列只...
迴圈佇列 順序佇列
在前兩篇中講述了順序佇列中的隊頭移動與不移動兩種順序佇列,今天討論順序佇列中的迴圈佇列,這種迴圈佇列是用一維陣列實現的。在隊頭移動的情況下,根據元素個數與佇列容量之間的數量關係來解決假溢位問題。從上圖中我們可以理解為什麼這種佇列結構可以解決假溢位問題,但是隨之而來,我們要如何判定迴圈佇列已滿呢?在此...