#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 佇列...