1. 程式人生 > >Python中的堆疊、佇列、連結串列

Python中的堆疊、佇列、連結串列

  • 區別:
    棧(Stack)是限定只能在表的一端進行插入和刪除操作的線性表。
    佇列(Queue)是限定只能在表的一端進行插入和在另一端進行刪除操作的線性表。
    1、佇列先進先出,棧先進後出。
    2、 對插入和刪除操作的”限定”。 棧是限定只能在表的一端進行插入和刪除操作的線性表。佇列是限定只能在表的一端進行插入和在另一端進行刪除操作的線性表。
    3.遍歷資料速度不同。佇列遍歷資料的速度要快得多

一,利用python列表實現堆疊
堆疊是一個後進先出的資料結構,其工作方式就像一堆汽車排隊進去一個死衚衕裡面,最先進去的一定是最後出來。

  我們可以設定一個類,用列表來存放棧中元素的資訊,利用列表的append()和pop()方法可以實現棧的出棧pop和入棧push的操作,list.append(obj)意思是向列表新增一個物件obj,list.pop(index=-1)意思是刪除指定位置的物件,預設是最後一個物件,也就是說list.pop(),是刪除列表中下標最大的元素
  

#coding=UTF-8
# http://blog.csdn.net/u010786109/article/details/40649827

class Stack():
# 我們可以設定一個類,用列表來存放棧中元素的資訊,
# 利用列表的append()和pop()方法可以實現棧的出棧pop和入棧push的操作
# 類中有個top屬性,用來指示棧的儲存情況,初始值為-1,一旦插入一個元素,其值加1,
# 利用top的值可以判定棧是空還是滿,具體原理可參考資料結構教材


    def __init__(self,size):
        self.stack=[]
        self.size=size
        self.top=-1
def isfull(self): self.top+1==self.size def isempty(self): self.top == -1 def show_stack(self): print self.stack # 推壓 def push(self,x): if self.isfull(): print "stack is full" else: self.stack.append(x) self.top+=1
# 彈 def pop(self): if self.isempty(): print "stack is empty" else: self.stack.pop() self.top-=1 if __name__ == '__main__': # 最後幾行程式碼先將0,1,2,3,4依次入棧,然後刪除棧頂的前三個元素, s = Stack(5) # 入棧 for i in range(5): s.push(i) s.show_stack() # 出棧 for i in range(3): s.pop() s.show_stack()

二,利用python列表實現佇列

   佇列是一種先進先出的資料型別,它的跟蹤原理類似於在超市收銀處排隊,佇列裡的的第一個人首先接受服務,新的元素通過入隊的方式新增到佇列的末尾,而出隊就是將佇列的頭元素刪除。

   我們可以設定一個類,用列表來存放棧中元素的資訊,利用列表的append()和pop()方法可以實現佇列的入隊enqueue和出隊dequeue的操作,上面棧一個元素每次出去是列表的最後一個,直接用list.pop()出棧,而出佇列每次是第一個,所以要用list.pop(0)出佇列,具體實現參考以下程式碼:
   

#coding=UTF-8

class Queue():
    def __init__(self,size):
        self.queue=[]
        self.size=size
        self.front=-1
        self.rear=-1

    def enqueue(self,ele):
        if self.isfull():
            print "queque is full"
        else:
            self.queue.append(ele)
            self.rear=self.rear+1

    def dequeue(self):
        if self.isempety():
            print "queque is empety"
        else:
            self.queue.pop(0)
            self.front=self.front+1

    def isempety(self):
        return self.front==self.rear

    def isfull(self):
        return self.front-self.rear+1==self.size

    def showQueue(self):
        print self.queue

q=Queue(10);
for i in range(5):
    q.enqueue(i)
q.showQueue()
for i in range(3):
    q.dequeue()
q.showQueue()
print q.isempety()
[0, 1, 2, 3, 4]
[3, 4]
False

三、連結串列
http://www.cnblogs.com/king-ding/p/pythonchaintable.html
連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域。

連結串列當然像鎖鏈一樣,由一節節節點連在一起,組成一條資料鏈。

連結串列的節點的結構如下:
data為自定義的資料,next為下一個節點的地址。
連結串列的結構為,head儲存首位節點的地址:
這裡寫圖片描述