資料結構(Python實現)之佇列及棧
昨天被面試官問到,怎麼實現一個佇列?佇列原理上很簡單,就是先進先出。我之前用C寫過,卻不曾用Python寫過,但Python只會更簡單不會更復雜。我思考了1秒鐘,告訴面試官,可以利用列表,append方法即是入隊,取出列表的第0元素即是出隊。回家後,我立即動手寫了一遍。鑑於棧與佇列只存在些許不同,本篇將一起實現棧。下面分享給大家。
----------------------------------------基本原理----------------------------------------
此處考慮初學者,對原理有了解的請跳過本步。
佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端進行刪除操作,而在表的後端進行插入操作。
這也是其名稱的由來,這就像排隊一樣,先進先出,後進後出。
而棧與佇列唯一的不同即是,取出棧元素不是從頭部取出,而是尾部。即先進後出。就像槍械的子彈匣,後放進去的子彈反而先被髮射出去。
----------------------------------------程式碼----------------------------------------
class Queue(list):
def __init__(self,args=[]):
# 呼叫列表的初始化方法
list.__init__([])
# self現在被初始化為一個空列表,如果希望佇列被初始化,我們只需要把引數加到這個空列表裡
self += args
# 我們只需要新增一個取出方法即可
def take(self):
if self:
temp = self[0]
del self[0]
return temp
else:
return None
# 棧
class Stack(list):
def __init__(self,args=[]):
list.__init__([])
self += args
# 棧的取出是在尾部,這是與佇列唯一不同的地方。其他地方不再贅述。
def take(self):
if self:
temp = self[-1]
del self[-1]
return temp
else:
return None
if __name__ == '__main__':
queue = Queue([1, 2, 3, 4, 5])
print('佇列初始化',queue)
queue.append(9)
print('新增佇列',queue)
for i in range(7):
temp = queue.take()
print('取出佇列',temp)
print('當前佇列',queue)
print('-' * 30, '分割線', '-' * 30)
stack = Stack([1, 2, 3, 4, 5])
print('棧初始化',stack)
stack.append(9)
print('新增棧',stack)
for i in range(7):
temp = stack.take()
print('取出棧',temp)
print('當前棧',stack)
----------------------------------------效果----------------------------------------