迴圈佇列 解決順序佇列的假溢位問題

2021-10-16 05:06:34 字數 2305 閱讀 7805

迴圈佇列

當進行動態建立佇列的時候,也只不過是向後繼續不斷的申請記憶體空間,即時前面出隊操作釋放掉了前面的空間,但是指標依舊會向後進行移動,直到達到系統預留給程式的記憶體上界被強行終止,這對於極為頻繁的佇列操作和程式而言是致命的,這時候,就需要對我們的佇列進行優化,使用更為優秀的結構——迴圈佇列

初始化時直接建立兩個游標指標,分別指向頭結點和尾結點即可。

入隊操作同順序佇列的方法,直接將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 可有時想想,為什麼出佇列時一定要全部移動呢,如果不去限制佇列的元素必須儲...