日韩性视频-久久久蜜桃-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 | 五月天色婷婷综合 | 天堂成人国产精品一区 | 亚洲精品成人区在线观看 | av免费在线不卡 | 三级黄色网 | 啪免费视频 | 91情侣在线 | 激情六月婷| 日本a∨视频 | 伦av综合一区 | 麻豆一区产品精品蜜桃的特点 | 2024男人天堂 | 国产黄色免费在线观看 | 美国av大片 | 成人性生交大片免费 | 蛇女欲潮性三级 | 给我看免费高清在线观看 | 老湿福利影院 | 污污视频免费网站 | 三级91 | 免费操人视频 | 在线第一页 | 欧美wwwwww| 亚洲色图3p| 毛茸茸日本熟妇高潮 | aaa人片在线 | 国产丝袜在线播放 | 91国模少妇一区二区三区 | 国产精品一区二区av白丝下载 | 亚洲专区一区 | 最新日本中文字幕 | 另类天堂av | 爱爱免费视频 | 国内自拍第三页 | 成人28深夜影院 | 日本欧美国产在线 | 极品久久久 | 免费人成自慰网站 | 农村妇女精品一区二区 | 日本人妻换人妻毛片 | 男人撒尿视频xvideos | 色欧美亚洲 | 成人国产精品视频 | 国产综合视频一区二区 | 少妇一级淫片免费看 | 秋霞欧美在线观看 | 青草视屏 | 日本捏奶吃奶的视频 | 国产色呦呦| 亚洲成人精品av | 少妇第一次交换又紧又爽 | 女女同性女同一区二区三区按摩 | 成年人网站黄 | 久久国产精品久久久久 | 欧美特一级片 | 蜜臀尤物一区二区三区直播 | 日本乱淫视频 | 最近中文字幕在线观看视频 | 久久久久噜噜噜亚洲熟女综合 | 自拍欧美日韩 | 奇米综合 | 操白虎逼 | 欧美xxxxxx片免费播放软件 | 日本欧美一区二区三区不卡视频 | 天天射网站 | 91久久国产| 日韩大尺度在线观看 | 自拍偷拍1| av在线免费播放网址 | 日韩av一卡二卡 | 青青久久av | 天天摸天天爽 | 国产视频日本 | jiuse九色 | 欧洲亚洲视频 | 末发成年娇小性xxxxx | 成人看片在线观看 | 图片区亚洲色图 | 一区二区视频免费 | 亚洲热在线视频 | 3d动漫精品啪啪一区二区免费 | 一二三四区视频 | 亚洲国产日韩欧美一区二区三区 | 最近中文字幕免费视频 | 久久久精品久久 | 91涩涩视频| 欧美天天搞 | 中文字幕第一区 | 日韩欧美第一区 |