佇列先進先出:fifo
使用單鏈表實現佇列
用單鏈表實現佇列
class node(object):
definit(self, value=none, next=none):
self.value = value
self.next = next
class linkedlist(object):
definit(self, maxsize=none):
self.maxsize = maxsize
self.root = node()
self.tailnode = none
self.length = 0
def __len__(self):
return self.length
if self.maxsize is not none and len(self) >= self.maxsize:
raise exception('鍊錶滿了!')
tailnode = self.tailnode
node = node(value)
if tailnode is not none:
tailnode.next = node
else:
self.root.next = node
self.tailnode = node
self.length += 1
def popleft(self):
headnode = self.root.next
if headnode is none:
raise exception('鍊錶為空!')
self.root.next = headnode.next
value = headnode.value
del headnode
self.length -= 1
return value
class fullerror(exception):
pass
class emptyerror(exception):
pass
class queue(object):
definit(self, maxsize=none):
self.maxsize = maxsize
self._items = linkedlist(maxsize)
def __len__(self):
return len(self._items)
def push(self, value):
'''入隊操作'''
if self.maxsize is not none and len(self) >= self.maxsize:
raise fullerror('queue full')
def pop(self):
if len(self) <= 0:
raise emptyerror('queue empty')
return self._items.popleft()
def test_queue():
q = queue()
q.push(1)
q.push(2)
q.push(3)
assert q.pop() == 1
assert q.pop() == 2
assert q.pop() == 3
assert len(q) == 0
ifname== 『main』:
test_queue()
使用陣列來實現佇列
需要借助兩個指標,head和tail,push時head指標往後移,pop時tail指標往後移
判斷佇列滿:head - tail + 1 > size (陣列容量)
判斷為空:尾指標和頭指標指向同乙個位置
迴圈使用陣列:當頭指標指向最後乙個位置時,又從0開始,從頭開始
『』』
用陣列實現乙個佇列
『』』class array(object):
definit(self, size=none):
『』』初始化陣列
:param size: 陣列容量
『』』self.size = size
self._items = [none] * size
def __getitem__(self, index):
return self._items[index]
def __setitem__(self, index, value):
self._items[index] = value
def clear(self):
for i in range(self.size):
self._items[i] = none
def __iter__(self):
for i in range(self.size):
yield self._items[i]
class fullerror(exception):
pass
class emptyerror(exception):
pass
class arrayqueue(object):
definit(self, size):
self.size = size
self.array = array(size)
self.head = 0 # 頭指標
self.tail = 0 # 尾指標
def push(self, value):
if self.head - self.tail + 1 > self.size:
raise fullerror('queue full')
self.array[self.head % self.size] = value
self.head += 1
def pop(self):
if self.head == self.tail:
raise emptyerror('queue empty')
value = self.array[self.tail % self.size]
self.tail += 1
return value
def test_array_queue():
q = arrayqueue(5)
q.push(1)
q.push(2)
q.push(3)
q.push(4)
q.push(5)
# q.push(6) # 報錯
assert q.pop() == 1
assert q.pop() == 2
assert q.pop() == 3
assert q.pop() == 4
assert q.pop() == 5
# assert q.pop() == 6 # 報錯
ifname== 『main』:
test_array_queue()
**:
Python資料結構與演算法筆記(2)
problem solving with algorithms and data structure using python 中文版 3 基本資料結構 棧 佇列 deques 列表是一類資料的容器,它們資料項之間的順序由新增或刪除的順序決定。一旦乙個資料項被新增,它相對於前後元素一直保持該位置不變...
資料結構與演算法(2)
程式設計 資料結構 演算法 資料元素 是組成資料的 有一定意義的基本單位,在計算機中通常作為整體處理。資料項 乙個資料元素可以由若干個資料項組成。資料項是資料不可分割的最小單位。資料物件 是性質相同的資料元素的集合,是資料的子集。資料結構 是相互之間存在一種或多種特定關係的資料元素的集合。邏輯結構 ...
資料結構與演算法(2)
鏈結參考 資料結構是相互之間存在一種或多種特定關係的資料元素的集合 那麼具體是什麼關係呢,或者說,這裡的結構又是指什麼呢?按照視點的不同,我們把資料結構分為邏輯結構和物理結構 1,邏輯結構 是指資料物件中資料元素之間的相互關係 邏輯結構分為以下四種 2,物理結構 是指資料的邏輯結構在計算機中的儲存形...