資料結構---隊棧操作(Python)
阿新 • • 發佈:2019-01-06
因為最近要完成有關樹的搜尋的演算法,涉及到深度、廣度優先遍歷,因此很有必要將棧和佇列這個景點資料結構回顧一遍,使用Python語言編碼。因為實在是比較簡單,沒加註釋,同行有需要的直接拷貝過去就行
話不多說先上棧操作的程式碼:
#coding:utf-8 class Stack(object): def __init__(self): self.stack = [] self.top = 0 #初始化棧頂為0 def push(self, data): #入棧 i = 0 lenth = len(data) for i in range(lenth): self.stack.append(data[i]) self.top += 1 #棧頂指標後移一個位置 print("入棧後的棧頂位置:top->%d" %(self.top-1)) return self.stack def pop(self,stack): #出棧 self.top = len(stack) -1 k = self.top for i in range(k+1): print("top->%d:%d" %(self.top, stack[self.top])) self.top -= 1 data = [] lenth = input("請輸入data的長度:") for i in range(lenth): x = input() data.append(x) print("data:%s" %data) s = Stack() stack = s.push(data) print("stack:%s,lenth:%d" %(stack, len(stack))) s.pop(stack)
對棧的理解就是往地上摞盤子的過程,入棧就相當於摞盤子,出棧就相當於取最上邊的盤子,只能一個一個從上邊拿,採取“先進後出”策略,即先進去的後出來。
佇列的程式碼如下:
#coding:utf-8 class Queue(object): def __init__(self): self.queue = [] self.topleft = 0 self.topright = 0 def push(self, data): lenth = len(data) i = 0 for i in range(lenth): self.topright += 1 self.queue.append(data[i]) self.topright -= 1 print("入隊完畢,佇列:%s,隊頭topleft->%d,隊尾topright->%d" %(self.queue, self.topleft, self.topright)) return self.queue def pop(self,data): self.queue = data while True: if self.topleft == self.topright: print("出隊元素:%d,隊尾topleft->%d" %(data[self.topleft], self.topleft)) self.queue.pop(0) print("出隊完畢") break else: print("出隊元素:%d,隊尾topright->%d" %(data[self.topleft], self.topright)) self.queue.pop(0) self.topright -= 1 data = [] lenth = input("請輸入data的長度:") for i in range(lenth): x = input() data.append(x) print("data:%s" %data) s = Queue() queue = s.push(data) s.pop(queue)
對佇列的理解就是打子彈,先按進彈夾的子彈會先打出來,採取“先進先出”策略,即先進佇列的成員應該先出隊。
佇列這裡有一點需要特別注意!!
隊列出隊預設是最先進來的那個元素,假設queue[0] = A這個元素出隊了,那麼原本queue[1] = B這個元素自動←移一個單位變成queue[0] =B,因此我們每次出隊的時候只需要出queue[0]這個元素就行了,每出一次,隊尾topright都要減一左移一個單位,目的是判斷什麼時候佇列空了。