佇列(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():
("queue is full"
)return
false
else
: self.rear = self.rear +
1return
true
defdequeue
(self)
:# 出隊操作
if self.isempty():
("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)
(self.queue)
qq= myqueue(10)
("初始化隊列為空"
,qq.isempty())
for i in
range(10
):qq.enqueue(i)
qq.show(
("插入十個元素後,隊滿"
,qq.isfull())
(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...