迴圈佇列
當進行動態建立佇列的時候,也只不過是向後繼續不斷的申請記憶體空間,即時前面出隊操作釋放掉了前面的空間,但是指標依舊會向後進行移動,直到達到系統預留給程式的記憶體上界被強行終止,這對於極為頻繁的佇列操作和程式而言是致命的,這時候,就需要對我們的佇列進行優化,使用更為優秀的結構——迴圈佇列。
初始化時直接建立兩個游標指標,分別指向頭結點和尾結點即可。
入隊操作同順序佇列的方法,直接將rear向後移動即可,但是要注意判斷,如果rear達到了佇列的空間上限,將要從頭節點繼續開始移動
如果順序佇列的出隊操作,直接將front進行後移一位即可,注意這時候有乙個需要留意的地方,即佇列是否為空,當隊列為空的時候是無法進行出隊操作的
接下來**實現一下迴圈佇列:
class
node
(object):
"""結點類"""
def__init__
(self, item)
:"""例項屬性初始化和賦值"""
self.item = item
self.
next
=none
class
queue
(object):
def__init__
(self, head=
none
, end=
none):
# 初始化頭結點游標指標
self.head = head
# 初始化尾結點游標指標
self.end = end
defaddnode
(self, item)
:"""新增節點資料"""
node = node(item)
# 隊列為空的情況
if self.head is
none
: self.head = node
self.end = node
return
# 佇列不為空的情況,每個佇列都會有乙個容量上限,假設我們迴圈佇列容量為100
if self.length(
)<
100:
cur = self.end
cur.
next
= node
self.end = node
return
else
: cur = self.end
cur.
next
= self.head
return
defremovenode
(self)
:"""刪除節點資料"""
# 佇列特性,先進先出
if self.head:
cur = self.head
self.head = cur.
next
return
deflength
(self)
:"""返回佇列長度"""
if self.head:
# 構建游標和計數器
cur = self.head
count =
0# 迴圈查詢下一結點,不存在則終止
while cur is
notnone
: cur = cur.
next
count +=
1return count
else
:return
0if __name__ ==
'__main__'
: q = queue(
)print
(q.length())
for i in
range(1
,111):
if q.length()==
100:
break
else
: q.addnode(i)
print
(q.length())
q.removenode(
)print
(q.length(
))
順序表示的佇列 順序佇列2 假溢位
要求順序迴圈佇列不損失乙個空間全部能夠得到有效利用,請採用設定標誌位tag的方法解決 假溢位 問題,實現順序迴圈佇列演算法。考察迴圈隊列入隊和出隊演算法思想。設定標誌位tag,初始時tag 0,當元素入隊成功,令tag 1 出隊成功令tag 0。則隊列為空的判定條件為front rear tag 0...
順序佇列的假溢位及順序迴圈佇列的表示(C 版)
順序佇列的假溢位 按照前面所說的順序佇列的儲存方法 有可能造成 假溢位 這種溢位不是因為儲存空間不夠而溢位,而是經過多次插入和刪除操作引起的,像這種有儲存空間而不能進行插入的元素操作的溢位稱為 假溢位 為了避免順序佇列造成的 假溢位 現象,通常採用順序迴圈佇列來實現佇列的順序儲存。順序迴圈佇列的定義...
佇列 順序佇列儲存結構的不足(假溢位)
我們假設乙個佇列有n個元素,則順序儲存的佇列需建立乙個大於n的陣列,並把佇列的所有元素儲存在陣列的前n個單元,陣列下標為0的一端即是隊頭。所謂的入佇列操作,其實就是在隊尾追加乙個元素,不需要移動任何元素,因此時間複雜度為0 1 可有時想想,為什麼出佇列時一定要全部移動呢,如果不去限制佇列的元素必須儲...