日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python数据结构:栈的应用

發布時間:2024/3/24 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python数据结构:栈的应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【Python數據結構1】棧的應用

棧Stack:什么是棧?

?一種有次序的數據項集合,在棧中,數據項的加入和移除都僅發生在同一端
這一端叫棧“頂top”,另一端叫棧“底base”
?日常生活中有很多棧的應用,如:盤子、托盤、書堆等等

?距離棧底越近的數據項,留在棧中的時間就越長,而最新加入棧的數據項會被最先移除
?這種次序通常稱為后進先出LIFO:Last in First out
這是一種基于數據項保存時間的次序,時間越短的離棧頂越近,而時間越長的離棧底越近
???抽象數據類型“棧”定義為如下的操作:
Stack():創建一個空棧,不包含任何數據項
push(item):將item加入棧頂,無返回值
pop():將棧頂數據項移除,并返回,棧被修改
peek():“窺視”棧頂數據項,返回棧頂的數據項但不移除,棧不被修改
isEmpty():返回棧是否為空棧
size():返回棧中有多少個數據項

抽象數據類型Stack:操作樣例

另外

python列表(list)就具有棧的特性,其函數與棧中相對應的函數功能類似,故可以直接把list當做棧來使用,也可以利用list構建Stack類

棧代碼示例

class Stack:def __init__(self):self.items=[]def isEmpty(self):return self.items==[]def push(self,item):self.items.append(item)def pop(self):return self.items.pop()def peek(self):return self.items[len(self.items)-1]def size(self):return len(self.items)

示例1:進制轉換

直接使用list做為棧

def HexConv(decNumber,base):dights=[str(i) for i in range(10)]+[chr(i) for i in range(65,72)]remstack=[]while decNumber>0:rem=decNumber%baseremstack.append(dights[rem])decNumber//=baseres=""while remstack!=[]:res+=remstack.pop()return resif __name__ == '__main__':n=int(input("請輸入原數:"))hex=int(input("目標進制:"))print("十進制{}轉換為{}進制結果:{}".format(n,hex,HexConv(n,hex)))

示例2:括號匹配

引入Stack類

from stack_set import Stackdef bracMatch(bracketItem):bracketList = list(bracketItem)braStack = Stack()leftbrac = "{[("rightbrac = "}])"result = Truefor item in bracketList:if item in leftbrac:braStack.push(item)elif item in rightbrac:if braStack.isEmpty():result = Falseelse:# peek函數取棧頂元素,判斷棧頂元素是否跟右括號相對應if matchBoth(braStack.peek(), item):braStack.pop()else:result = Falseif braStack.isEmpty() and result:result = Trueelse:result = Falsereturn resultdef matchBoth(item1, item2):leftbrac = "{[("rightbrac = "}])"return leftbrac.index(item1) == rightbrac.index(item2)if __name__ == "__main__":str = input("請輸入表達式")if bracMatch(str):print("括號匹配")else:print("括號不匹配")

示例3:中綴表達式轉為后綴表達式

from stack_set import Stackdef infixToPostfix(infixpr):pre={}pre['*'],pre['/']=3,3pre['+'],pre['-']=2,2pre['(']=1charlist=[chr(i) for i in range(65,91)]numlist=[i for i in range(10)]# 生成一個用于存儲符號的棧和一個用于存儲值的列表opstack=Stack()postfixlist=[]items=infixpr.split()for item in items:# 判斷是否為表達式中的值if item in charlist or item in numlist:postfixlist.append(item)elif item=="(":opstack.push(item)elif item==')':tokentop=opstack.pop()while tokentop!="(":postfixlist.append(tokentop)tokentop=opstack.pop()else:# 當棧非空時,入棧的符號要先檢查其是否滿足入棧優先級while(not opstack.isEmpty()) and (pre[item]<=pre[opstack.peek()]):postfixlist.append(opstack.pop())opstack.push(item)print("stack:{},postlist:{}".format(opstack.items,postfixlist))# 最后將棧中元素出棧(進棧前已考慮優先級,出棧直接出)while not opstack.isEmpty():postfixlist.append(opstack.pop())return "".join(postfixlist) if __name__ == '__main__':infix="A + ( B * C )"postfix=infixToPostfix(infix)print("其對應的后綴表達式:{}".format(postfix))

讀者可自行體會直接使用list與構建stack的區別

參考:MOOC陳斌老師

總結

以上是生活随笔為你收集整理的Python数据结构:栈的应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。