python實現佇列

2021-10-19 05:50:22 字數 4226 閱讀 4221

佇列(queue):和棧一樣,也是一種操作受限的線性表,但它只允許在表的一端進行插入,在另一端進行刪除。操作特徵是先進先出(fifi,first in first out)

隊頭(front):允許刪除的一端,又稱為隊首

隊尾(rear):允許刪除的一端

空佇列:不含有任何元素的空表

佇列常見操作:

iniqueue():初始化佇列,構造乙個空佇列

isempty():判空

isfull():判滿

enqueue():若佇列未滿,從隊尾入隊

dequeue():若佇列非空,從隊首出隊

gethead():獲取隊首元素

順序佇列:

分配一塊連續的儲存單元,並附帶兩個指標front和rear分別指示隊首元素和隊尾元素,一般隊首指標指向隊首元素,隊尾指標指向隊尾元素的下乙個位置。

:#初始化乙個空佇列

self.size = size

self.front =

0 self.rear =

0 self.queue =

defenqueue

(self, x)

:# 入隊操作

if self.isfull():

print

("queue is full"

)return

false

else

: self.rear = self.rear +

1return

true

defdequeue

(self)

:# 出隊操作

if self.isempty():

print

("queue is empty"

)return

false

else

: duiwei = self.queue[self.front]

self.front = self.front +

1 self.queue.pop(self.front)

return duiwei

defisfull

(self)

:return self.rear - self.front +

1== self.size

defisempty

(self)

:return self.front == self.rear

defgethead

(self)

:if self.isempty():

return

false

else

:return self.queue[self.front]

defshow

(self)

:print

(self.queue)

qq= myqueue(10)

print

("初始化隊列為空"

,qq.isempty())

for i in

range(10

):qq.enqueue(i)

qq.show(

)print

("插入十個元素後,隊滿"

,qq.isfull())

print

(qq.dequeue(

))輸出為:

初始化隊列為空 true

queue is full[0

,1,2

,3,4

,5,6

,7,8

]插入十個元素後,隊滿 true

0

需要注意的地方:

1)初始狀態(隊列為空):front==rear=0

2)入隊:隊不滿時,先送值到隊尾元素,然後rear加1

3)出隊:隊非空時,先取隊首元素的值,然後front加1

4)不可以用"rear=size"來判斷佇列是否為滿,上圖(d)也滿足"rear=size",但不是隊列為滿,這是一種假溢位。

迴圈佇列

順序佇列存在缺點,元素出隊後該位置就空著而沒有被利用,最終造成假溢位,新的元素也無法入隊。使用迴圈佇列來解決這個問題:即把儲存佇列元素的表從邏輯上看作乙個環。

初始時:front=rear=0

出隊時:front=(front+1)%size

入隊時:rear=(rear+1)%size

元素個數:(rear+size-front)%size

隊空的條件:rear=front

隊滿的條件:rear=front,如圖所示,將會導致無法判斷隊空或者隊滿。

三種方式來區分隊空還是隊滿:

1)犧牲乙個單元,入隊時少用乙個佇列單元,即佇列的元素個數最大為size-1

元素個數:(rear+size-front)%size

隊空的條件:rear=front

隊滿的條件:(rear+1)%size=front

2)佇列增加乙個元素個數的資料成員,elenum=0時隊列為空,elenum=size時隊列為滿。

3)型別中增加乙個tag資料成員,出隊導致rear=front,tag=0,表示隊空;入隊導致rear=front,tag=1,表示隊滿

第一種方式的**實現如下:

class

mycyclequeue()

:def

__init__

(self,size)

:#初始化

self.rear=

0 self.front=

0 self.size=size

self.queue=

defisempty

(self)

:#判空

return

true

if self.front==self.rear else

false

defisfull

(self)

:#判滿

return

true

if(self.rear+1)

%self.size==self.front else

false

defelenum

(self)

:#獲取元素個數

return

(self.rear + self.size - self.front)

%self.size

defenqueue

(self,x)

:#入隊

if self.isfull():

print

("queue is full"

)return

false

else

: self.rear=

(self.rear+1)

%self.size

defdequeue

(self)

:#出隊

if self.isempty():

print

("queue is empty"

)return

false

else

: x=self.queue[self.front]

self.front=

(self.front+1)

%self.size

self.queue.pop(self.front)

return x

鏈佇列:

同時帶有隊頭指標和隊尾指標的單鏈表,頭指標指向隊頭節點,隊尾指標指向隊尾結點。

python 清空佇列 python實現 佇列

佇列 佇列的乙個特性是 先進先出 first in first out,fifo python中,同樣可以使用列表來儲存佇列的資料。通過建立乙個佇列類,便可以方便的對佇列進行操作。主要有 入隊 in 出隊 out 清空佇列 empty 設定佇列大小 setsize 獲取隊尾位置 getend 等 p...

佇列(python實現)

adt queue queue self 建立空佇列 is empty self 判斷佇列是否為空 enqueue self,elem 入隊 dequeue self 出隊 peek self 檢視最早入隊的元素,不刪除class queueunderflow valueerror 空佇列訪問 pa...

Python實現佇列

佇列 是一種特殊的線性表,特殊之處在於它只允許在表的前端 front 進行刪除操作,而在表的後端 rear 進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。特點 先進先出。class queue object def init self se...