05 資料結構與演算法 佇列

2021-08-30 02:43:56 字數 3316 閱讀 9354

#created by: chen da

"""佇列類似生活中的排隊,為fifo結構。

兩個基本操作:入隊push和出隊pop。

用單鏈表可以實現,雙鏈表雖然可以,但是操作比較複雜。

"""#先實現乙個單鏈表

class node(object):

def __init__(self,value=none,next=none):

self.value,self.next = value,next

class linkedlist(object):

def __init__(self,max_size=none):

self.max_size = max_size

self.root = node()

self.length = 0

self.tail_node = none

def __len__(self):

return self.length

if self.max_size is not none and self.length > max_size:

raise exception("the linkednode is full!")

node = node(value)

tail_node = self.tail_node

if tail_node is none: #只有根節點

self.root.next = node

else:

tail_node.next = node

self.tail_node = node #將尾節點指向新增的節點

self.length += 1

if self.max_size is not none and self.length > max_size:

raise exception("the linkednode is full!")

head_node = self.root.next

node = node(value)

self.root.next = node

node.next = head_node

self.length += 1

def iter_node(self):

cur_node = self.root.next

while cur_node.next is not none:

yield cur_node

cur_node = cur_node.next

yield cur_node

def __iter__(self):

for node in self.iter_node():

yield node.value

def remove(self,value):

pre_node = self.root

cur_node = self.root.next

for cur_node in self.iter_node():

if cur_node.value == value:

pre_node.next = cur_node.next

if cur_node is self.tail_node:

self.tail_node = pre_node

del cur_node

self.length -= 1

return 1

else:

pre_node = cur_node

return -1

def find(self,value):

index = 0

for node in self.iter_node():

if node.value == value:

return index

index += 1

return -1

def pop_left(self):

if self.root.next is none:

raise exception("單鏈表已空")

head_node = self.root.next

self.root.next = head_node.next

self.length -= 1

value = head_node.value

del head_node

return value

def clear(self):

for node in self.iter_node():

del node

self.root.next = none

self.length = 0

#################################

#以下是queue

#################################

class fullerror(exception):

pass

class emptyerror(exception):

pass

class queue(object):

def __init__(self,max_size=none):

self.max_size = max_size

self._item_linked_list = linkedlist()

def __len__(self):

return len(self._item_linked_list)

def push(self,value):

if self.max_size is not none and len(self) > max_size:

raise fullerror("queue is full!")

def pop(self):

if len(self) == 0:

raise emptyerror("queue is empty!")

return self._item_linked_list.pop_left()

#寫乙個單測(這裡寫的不全)

def test_queue():

q = queue()

q.push(0)

q.push(1)

q.push(2)

assert len(q) == 3

assert q.pop() == 0

assert q.pop() == 1

assert q.pop() == 2

if __name__ == "__main__":

test_queue()

資料結構與演算法05 棧 佇列

特點在於只能允許在容器的一端 稱為棧頂端指標,英語 top 進行加入資料 英語 push 和輸出資料 英語 pop 的運算。後進先出 lifo,last in first out 棧描述的是操作,線性表描述的是資料存放鍊錶 操作頭部 順序表 操作尾部 return self.list 是不太合適的 ...

資料結構與演算法 佇列

學習了好長 一段時間的資料結構,由於時間關係一直沒有寫部落格。這次打算將這段時間的學習內容寫下來做個整理。佇列作為線性結構的一種,其實用性不用多說。這裡總結下兩種結構的佇列實現。迴圈佇列 先列下以順序表結構形成的普通順序佇列存在的問題 隊頭不斷刪除元素,將使佇列的頭部空出單元 隨著刪除 插入的進行,...

資料結構與演算法 佇列

佇列 佇列與棧不同,它是一種先進先出的結構 實現 1 陣列 2 鍊錶 記錄的資料 1 隊首位置 第乙個元素的位置 2 隊尾位置 最後乙個元素的位置 3 佇列大小 size 佇列操作 entryqueue 入隊 exitqueue 出隊 isqueueempty 隊列為空 isqueuefull 佇列...