栈和队列在python中的实现
棧和隊列是兩種基本的數據結構,同為容器類型,隊列是先進先出,棧是先進后出。
棧
棧提供 push 和 pop 等等接口,所有元素必須符合先進后出規則,所以棧不提供走訪功能,也不提供迭代器(iterator)。 不像是set 或者map 提供迭代器iterator來遍歷所有元素。
棧是以底層容器完成其所有的工作,對外提供統一的接口,底層容器是可插拔的(也就是說我們可以控制使用哪種容器來實現棧的功能)。
對于stack我們可以使用python內置的list實現,因為list是屬于線性數組,在末尾插入和刪除一個元素所使用的時間都是O(1),這非常符合stack的要求。當然,我們也可以使用鏈表來實現。
stack的實現代碼(使用python內置的list),實現起來是非常的簡單,就是list的一些常用操作。
class Stack(object):def __init__(self):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]
隊列
隊列是一種先進先出的(First In First Out)的線性表,簡稱FIFO。允許插入的一端為隊尾,允許刪除的一端為隊頭。隊列不允許在中間部位進行操作!假設隊列是q=(a1,a2,……,an),那么a1就是隊頭元素,而an是隊尾元素。這樣我們就可以刪除時,總是從a1開始,而插入時,總是在隊列最后。這也比較符合我們通常生活中的習慣,排在第一個的優先出列,最后來的當然排在隊伍最后。
定義一個頭結點,左邊指向隊列的開頭,右邊指向隊列的末尾,這樣就可以保證我們插入一個元素和取出一個元素都是O(1)的操作,使用這種鏈表實現stack也是非常的方便。實現代碼如下:
class Head(object):def __init__(self):self.left = Noneself.right = Noneclass Node(object):def __init__(self, value):self.value = valueself.next = Noneclass Queue(object):def __init__(self):#初始化節點self.head = Head()def enqueue(self, value):#插入一個元素newnode = Node(value)p = self.headif p.right:#如果head節點的右邊不為None#說明隊列中已經有元素了#就執行下列的操作temp = p.rightp.right = newnodetemp.next = newnodeelse:#這說明隊列為空,插入第一個元素p.right = newnodep.left = newnodedef dequeue(self):#取出一個元素p = self.headif p.left and (p.left == p.right):#說明隊列中已經有元素#但是這是最后一個元素temp = p.leftp.left = p.right = Nonereturn temp.valueelif p.left and (p.left != p.right):#說明隊列中有元素,而且不止一個temp = p.leftp.left = temp.nextreturn temp.valueelse:#說明隊列為空#拋出查詢錯誤raise LookupError('queue is empty!')def is_empty(self):if self.head.left:return Falseelse:return Truedef top(self):#查詢目前隊列中最早入隊的元素if self.head.left:return self.head.left.valueelse:raise LookupError('queue is empty!')
參考鏈接:https://www.cnblogs.com/yiduobaozhiblog1/p/9272556.html
總結
以上是生活随笔為你收集整理的栈和队列在python中的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Leetcode】刷题之路4(pyth
- 下一篇: [导入]Java线程的深入探讨