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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

使用栈实现中缀表达式转为后缀表达式和后缀表达式的求解

發(fā)布時間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用栈实现中缀表达式转为后缀表达式和后缀表达式的求解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

書籍在線網址http://interactivepython.org/runestone/static/pythonds/index.html

?

中文翻譯書籍:https://facert.gitbooks.io/python-data-structure-cn/

?

?

將中綴表達式轉換為后綴表達式


            中綴表達式(上圖,一般書寫)轉換為后綴表達式(ABC*+)

?

?

方法:

  • 創(chuàng)建一個名為 opstack 的空棧以保存運算符。給輸出創(chuàng)建一個空列表。
  • 通過使用字符串方法拆分將輸入的中綴字符串轉換為標記列表。
  • 從左到右掃描標記列表。
    • 如果標記是操作數,將其附加到輸出列表的末尾。
    • 如果標記是左括號,將其壓到 opstack 上。
    • 如果標記是右括號,則彈出 opstack,直到刪除相應的左括號。將每個運算符附加到輸出列表的末尾。
    • 如果標記是運算符,*,/,+或?-?,將其壓入 opstack。但是,首先刪除已經在 opstack 中具有更高或相等優(yōu)先級的任何運算符,并將它們加到輸出列表中。
  • 當輸入表達式被完全處理時,檢查 opstack。仍然在棧上的任何運算符都可以刪除并加到輸出列表的末尾
  • ?

    使用字典來保存操作符優(yōu)先級,這個字典將每個運算符映射到一個整數,可以與其他運算符的優(yōu)先級(我們使用整數3,2和1)進行比較。左括號將賦予最低的值。這樣,與其進行比較的任何運算符將具有更高的優(yōu)先級

    1 #coding:utf8 2 from stack import Stack 3 def infixToPostfix(infixexpr): 4 prec = {} 5 prec["*"] = 3 6 prec["/"] = 3 7 prec["+"] = 2 8 prec["-"] = 2 9 prec["("] = 1 10 opStack = Stack() 11 postfixList = [] #創(chuàng)建后綴輸出列表 12 tokenList = infixexpr.split() #將中綴列表轉換為字符串 13 14 for token in tokenList: 15 #如果標記是操作數,將其附加到輸出列表末尾 16 if token in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" or token in "0123456789": 17 postfixList.append(token)
    18 #如果標記是左括號,將其壓棧 19 elif token == '(': 20 opStack.push(token)
    21 #如果標記是右括號,彈棧添加到輸出列表末尾直到遇到左括號 22 elif token == ')': 23 topToken = opStack.pop() 24 while topToken != '(': 25 postfixList.append(topToken) 26 topToken = opStack.pop()
    27 #如果標記是運算符,刪除已經在棧中具有更高或相等優(yōu)先級的任何運算符并添加到輸出列表末尾,再壓棧 28 else: 29 while (not opStack.isEmpty()) and (prec[opStack.peek()] >= prec[token]): 30 postfixList.append(opStack.pop()) 31 opStack.push(token) 32 33 while not opStack.isEmpty():    #輸入表達式完全處理后將棧中剩下內容添加到輸出列表末尾 34 postfixList.append(opStack.pop()) 35 return " ".join(postfixList) #列表轉字符串 36 37 print(infixToPostfix("A * B + C * D")) 38 print(infixToPostfix("( A + B ) * C - ( D - E ) * ( F + G )"))

       #A B * C D * +
       #A B + C * D E - F G + * -

    ?

    ?

    后綴表達式求值

    對后綴表達式4 5 6 * +求值

    ?

    ?

    方法:?

    ?

  • 創(chuàng)建一個名為?operandStack?的空棧。
  • 拆分字符串轉換為標記列表。
  • 從左到右掃描標記列表。
    • 如果標記是操作數,將其從字符串轉換為整數,并將值壓到operandStack。
    • 如果標記是運算符*,/,+或-,它將需要兩個操作數。彈出operandStack 兩次。 第一個彈出的是第二個操作數,第二個彈出的是第一個操作數。執(zhí)行算術運算后,將結果壓到操作數棧中。
  • 當輸入的表達式被完全處理后,結果就在棧上,彈出 operandStack 并返回值。
  • 1 from stack import Stack 2 def postfixEval(postfixExpr): 3 operandStack=Stack() 4 tokenList=postfixExpr.split() #根據空格分隔字符串返回列表 5 print(tokenList) 6 #['7', '8', '+', '3', '2', '+', '/'] 7 8 for token in tokenList: 9 if token in "0123456789": 10 operandStack.push(int(token)) 11 else: 12 operand2=operandStack.pop() 13 operand1=operandStack.pop() 14 result=doMath(token,operand1,operand2) 15 operandStack.push(result) 16 return operandStack.pop() 17 18 def doMath(op,op1,op2): 19 if op=="*": 20 return op1*op2 21 elif op=='/': 22 return op1/op2 23 elif op=="+": 24 return op1+op2 25 else: 26 return op1-op2 27 28 print(postfixEval('7 8 + 3 2 + /')) 29 30 #['7', '8', '+', '3', '2', '+', '/'] 31 #3.0

    ?

    轉載于:https://www.cnblogs.com/xiongxueqi/p/8612085.html

    總結

    以上是生活随笔為你收集整理的使用栈实现中缀表达式转为后缀表达式和后缀表达式的求解的全部內容,希望文章能夠幫你解決所遇到的問題。

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