1. 程式人生 > >資料結構---隊棧操作(Python)

資料結構---隊棧操作(Python)

       因為最近要完成有關樹的搜尋的演算法,涉及到深度、廣度優先遍歷,因此很有必要將棧和佇列這個景點資料結構回顧一遍,使用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都要減一左移一個單位,目的是判斷什麼時候佇列空了。