2 資料結構與演算法python描述 佇列

2021-09-25 05:22:40 字數 3802 閱讀 8302

佇列先進先出: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,物理結構 是指資料的邏輯結構在計算機中的儲存形...