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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

栈的实现与应用

發布時間:2025/10/17 编程问答 8 豆豆
生活随笔 收集整理的這篇文章主要介紹了 栈的实现与应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、棧的實現

  • 方法一:就使用list即可


先進后出

  • 方法二:定義Stack,抽象出棧
class Stack:#棧的python實現def __init__(self):self.items = []def push(self, item):#append操作O(1)self.items.append(item)def pop(self):return self.items.pop()def peek(self):return self.items[-1]def isEmpty(self):return self.items == []def size(self):return len(self.items)

二、棧的應用

2.1平衡括號問題
#經典使用stack的場景:平衡括號問題 from stack import Stackdef is_balance(mystr):s = Stack()#默認是對稱的balance = Truefor item in mystr:if item == '(':s.push(item)elif item == ')':if s.isEmpty():#右括號多于左括號的情況balance = Falses.pop()if not s.isEmpty():#左括號多于右括號的情況balance = Falsereturn balanceif __name__ == '__main__':print(is_balance('((()))'))print(is_balance('(()'))
2.2廣義的平衡問題
#經典使用stack的場景:平衡括號問題 from stack import Stackdef is_balance(mystr):s = Stack()#默認是對稱的balance = Truefor item in mystr:if item in sym_dict.keys():s.push(item)elif item in sym_dict.values():if s.isEmpty():#右括號多于左括號的情況balance = Falseelif sym_dict[s.peek()] == item:s.pop()if not s.isEmpty():#左括號多于右括號的情況balance = Falsereturn balanceif __name__ == '__main__':sym_dict = {'(': ')','{': '}','[': ']',} print(is_balance('{{([][])}()}'))print(is_balance('[{()]'))
2.3 任意進制轉換問題

十進制轉換到其他進制時,存在取余最后求反的過程,這個求反過程如果利用stack這種數據結構,可以節省reverse(list)的O(n)操作!

from stack import Stack from functools import reducedef dec_to_any(num, base=2):s = Stack()symbol_bank = '0123456789ABCDE'#取余數,壓入stackwhile num > 0:item = num % bases.push(item)#除法取整必須使用 //num = num // base#pop并拼湊出字符串result = ''for i in range(s.size()):result += symbol_bank[s.pop()]return resultdef any_to_dec(num, base=2):s = Stack()symbol_bank = '0123456789ABCDE'result = 0i = 0for item in str(num):s.push(item)for i in range(s.size()):item = s.pop()result += symbol_bank.index(item) * base ** ireturn resultdef conversion(num, from_base, to_base):temp = any_to_dec(num, from_base)return dec_to_any(temp, to_base)if __name__ == '__main__':print(dec_to_any(25,2))print(dec_to_any(25,16))print(any_to_dec(11001,2))print(any_to_dec(19,16))print(conversion(11001,2,8))
  • 注意:

使用reverse來翻轉list比使用stack快10000倍,單純的翻轉操作肯定選reverse,但是stack在入棧以及出棧的時候可以進行一系列的操作,對于某一類問題非常合適!!

from stack import Stack import timeit from timeit import Timerdef reverse_list1(mylist):reversed(mylist)def reverse_list2(mylist):s = Stack()result = []for i in mylist:s.push(i)for i in range(s.size()):mylist[i] = s.pop()if __name__ == '__main__':a = list(range(10000))t1 = Timer('reverse_list1(a)', 'from __main__ import reverse_list1,a')print(t1.timeit(number=100))t2 = Timer('reverse_list2(a)', 'from __main__ import reverse_list2,a')print(t2.timeit(number=100))

2.4中綴表達式轉換
2.4.1 轉為后綴表達式

AB+CD -> ABCD+

特征:

  • ABCD這些操作數的相對位置不變,直接用一個list逐個存儲即可
  • 操作符’+’優先級小于C與D之間的*,故結果中這兩個操作符位置肯定要顛倒,想到用stack的特性
  • 括號也要壓入stack,括號內的操作符相當于一個子過程,只有當‘)‘出現,才可以pop從左括號到右括號的所有元素,繼續進行程序

解題思路:

以 "A * B + C * D"為例

#stack綜合運用 #啟發:stack不僅在入棧、出棧過程中可以做文章,比如篩選等操作, #同時,不一定要全部元素入棧后全部再出棧,可以入一部分、出一部分、再入 from stack import Stackdef postpix(exp):opstack = Stack()out_list = []exp = exp.split(' ')for item in exp:if item in operator_bank:if opstack.isEmpty():opstack.push(item)elif operator_bank[opstack.peek()] <= operator_bank[item]:opstack.push(item)else:#當opstack非空,且peek優先值大于當前item,則將opstack'('之后所有操作符pop并添加到out_list,不包括左括號while not opstack.isEmpty():top = opstack.pop()if top == '(':opstack.push('(')breakout_list.append(top)#別忘了先把當前item push進去opstack.push(item)#當遇到')',將opstack中元素pop并添加到out_list,知道遇到‘(’,左括號也要popelif item == ')':while not opstack.isEmpty():top = opstack.pop()if top == '(':breakout_list.append(top)#當字符為操作數else:out_list.append(item)while(not opstack.isEmpty()):top = opstack.pop()out_list.append(top)return ''.join(out_list)if __name__ == '__main__':operator_bank = {'(': 2,'*': 1,'/': 1,'+': 0,'-': 0,}operand_bank = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'# print(postpix("A*B+C*D"))print(postpix("( A + B ) * C - ( D - E ) * ( F + G )"))
2.4.2 后綴表達式求值

思路:

以 "7 8 + 3 2 + /"為例

實現:

from stack import Stackdef _do_math(stack, operator):#先pop出的數字為第二個操作數!!!一定要注意順序operand2 = int(stack.pop())operand1 = int(stack.pop())if operator == '+':return operand1 + operand2if operator == '-':return operand1 - operand2if operator == '*':return operand1 * operand2if operator == '/':return operand1 / operand2def evaluate_postfix(exp):"""求后綴算數表達式的值"""operand_stack = Stack()exp_list = exp.split(' ')for item in exp_list:if item in operand_bank:operand_stack.push(item)else:temp = _do_math(operand_stack,item)operand_stack.push(temp)return operand_stack.pop()if __name__ == '__main__':operand_bank = '123456789'print(evaluate_postfix('7 8 + 3 2 + /'))

三、參考

http://interactivepython.org/runestone/static/pythonds/BasicDS/toctree.html

總結

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

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

主站蜘蛛池模板: 日日夜夜精品视频 | 十大黄台在线观看 | 日本一区二区免费在线观看 | 日韩裸体视频 | 五月婷婷六月合 | 日日干天天干 | 特黄特色特刺激免费播放 | 污片在线免费看 | 欧美一区永久视频免费观看 | 天堂а√在线中文在线新版 | 潮喷失禁大喷水无码 | 国产男女猛烈无遮挡免费视频 | 中文视频一区二区 | 深爱激情av | 火影忍者羞羞漫画 | 91精品国产亚洲 | 天天色宗合 | 这里有精品视频 | 午夜在线视频 | 亚洲毛片一区 | 五月婷婷小说 | 91亚洲国产成人久久精品网站 | 在线观看视频福利 | av网页在线观看 | 狠狠天天 | 初尝人妻少妇中文字幕 | 爱插网 | 久久欲 | 免费毛片看片 | 国产稀缺精品盗摄盗拍 | 欧美日韩免费观看视频 | 中国少妇av| 日韩在线中文字幕视频 | 亚洲91精品 | 欧美中文字幕在线播放 | 日韩精品在线不卡 | 国产精品乱码一区 | a国产视频| 日本打屁股网站 | 成人网在线免费观看 | 亚洲大片免费观看 | 免费在线欧美 | 他揉捏她两乳不停呻吟动态图 | 又色又爽又高潮免费视频国产 | 国产欧美综合在线 | 看全色黄大色黄大片大学生 | 国产一区二区三区91 | 美女色综合| 四虎黄色 | jizzjizzjizz国产 | 中文字幕一区二区三区人妻 | 一级做a爱 | 国产精品99无码一区二区 | 激情一区 | 欧美亚韩一区二区三区 | 超碰在线最新地址 | 黄色国产大片 | 国产一区二区激情视频 | 国产欧美日韩综合精品一区二区三区 | 国产精品99久久久精品无码 | 国产精品永久在线观看 | 精品视频久久久久久久 | 久久久久亚洲AV成人无在 | 天天做天天爱天天爽综合网 | 黄色免费在线网址 | av成人免费在线观看 | 波多野结衣精品 | 你懂的网站在线观看 | xxxxxx欧美| 国产精品无码午夜福利 | 久久这里只有 | 免费看黄色的网站 | 放荡闺蜜高h季红豆h | 黄色性网站 | 高潮毛片 | 无码人妻精品一区二区三区99日韩 | 乱色熟女综合一区二区三区 | 在线看成人 | 三级久久久 | 欧美精品日韩少妇 | 人人综合| 国内视频一区 | 国产精品91久久 | 超碰精品在线 | 自拍99页| 中文字幕亚洲精品在线 | 韩国三级中文字幕hd浴缸戏 | 99久久久无码国产精品性色戒 | 久久丫精品忘忧草西安产品 | 国产黄免费 | 精品视频在线免费看 | 日本伦理中文字幕 | 欧美视频黄 | 青青网站 | 成人aⅴ视频 | 亚洲一区二区自拍 | 欧美日韩一区二区三区 | av免费的| 国产精品视频免费 |