python實現stack(棧)和隊列(queue)


棧和隊列是兩種基本的數據結構,同為容器類型。兩者根本的區別在於:
stack:后進先出

這里寫圖片描述

 

queue:先進先出

這里寫圖片描述

stack和queue是沒有查詢具體某一個位置的元素的操作的。但是他們的排列是按順序的

對於stack我們可以使用python內置的list實現,因為list是屬於線性數組,在末尾插入和刪除一個元素所使用的時間都是O(1),這非常符合stack的要求。當然,我們也可以使用鏈表來實現。

stack的實現代碼(使用python內置的list),實現起來是非常的簡單,就是list的一些常用操作

 

class Stack(object):
    def __init__(object):
        self.stack = []

    def push(self, value):
        self.stack.append(value)

    def pop(self):
        if self.stack:
            self.stack.pop()
        else:
            raise LookupError('stack is empty!')

    def is_empty(self):
        return bool(self.stack)

    def top(self):
        #取出目前stack中最新的元素
        return self.stack[-1]

定義如下的鏈表來實現隊列數據結構:

這里寫圖片描述

定義一個頭結點,左邊指向隊列的開頭,右邊指向隊列的末尾,這樣就可以保證我們插入一個元素和取出一個元素都是O(1)的操作,使用這種鏈表實現stack也是非常的方便。實現代碼如下:

class Head(object):
    def __init__(self):
        self.left = None
        self.right = None

class Node(object):
    def __init__(self, value):
        self.value = value
        self.next = None

class Queue(object):
    def __init__(self):
        #初始化節點
        self.head = Head()

    def enqueue(self, value):
        #插入一個元素
        newnode = Node(value)
        p = self.head
        if p.right:
            #如果head節點的右邊不為NOne
            #說明隊列中已經有元素了
            #就執行下列的操作
            temp = p.right
            p.right = newnode
            temp.next = newnode
        else:
            #這說明隊列為空,插入第一個元素
            p.right = newnode
            p.left = newnode

    def dequeue(self):
        #取出一個元素
        p = self.head
        if p.left and (p.left == p.right):
            #說明隊列中已經有元素
            #但是這是最后一個元素
            temp = p.left
            p.left = p.right = None
            return temp.value
        elif p.left and (p.left != p.right):
            #說明隊列中有元素,而且不止一個
            temp = p.left
            p.left = temp.next
            return temp.value

        else:
            #說明隊列為空
            #拋出查詢錯誤
            raise LookupError('queue is empty!')

    def is_empty(self):
        if self.head.left:
            return False
        else:
            return True

    def top(self):
        #查詢目前隊列中最早入隊的元素
        if self.head.left:
            return self.head.left.value
        else:
            raise LookupError('queue is empty!')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM