表示式求值

2021-08-29 00:24:57 字數 1434 閱讀 3277

今天把表示式求值給搞定吧。

問題:給你個表示式,有加減乘除和小括號,讓算出結果。

我們假定計算式是正確的,並且不會出現除數為0等錯誤。

py**好啊,在保證可讀性的前提下能壓到一共就三十多行**。

其實能壓到不到三十行,但是**就不好看了。。。。

計算函式:

def getvalue(a, b, op):

if op == "+":return a+b

elif op == "-":return a-b

elif op == "*":return a*b

else:return a/b

出棧乙個運算子,兩個數值,計算,將結果入data用於之後計算

def process(data, opt):

operator = opt.pop()

num2 = data.pop()

num1 = data.pop()

比較符號優先順序:

乘除運算優先順序比加減高。

op1優先順序比op2高返回true,否則返回false

def compare(op1, op2):

return op1 in ["*","/"] and op2 in ["+","-"]

主函式:

基本思路:

處理每個數字為乙個整數,處理每一項為乙個單獨的數字,把括號內處理為乙個單獨的數字。

把式子處理為只有整數、加減的式子再最後計算。

def calculate(s):

data = #資料棧

opt = #操作符棧

i = 0 #表示式遍歷的索引

while i < len(s):

if s[i].isdigit(): # 數字,入棧data

start = i

while i+1 < len(s) and s[i + 1].isdigit():

i += 1

elif s[i] == ")": # 右括號,opt出棧,data出棧並計算,結果入data,直到左括號

while opt[-1] != "(":

process(data,opt)#優先順序高的一定先彈出

opt.pop() # 出棧的一定是左括號

else: #優先順序不比棧頂高,opt出棧同時data出棧並計算,計算結果入data

while opt and not compare(s[i], opt[-1]):

if opt[-1] == "(":break #遇到左括號,停止計算

process(data, opt)

i += 1 #索引後移

while opt:

process(data, opt)

print(data.pop())

表示式求值

程式的說明見清華大學出版社 資料結構 c語言版 include include define stack init size 40 define stackincrement 20 define ok 1 define false 0 typedef structs stack typedef st...

表示式求值

既然是表示式求值,自然需要在記憶體中儲存計算結果以及中間值。在 用c語言寫直譯器 一 中提過 變數要求是若型別,而 c 語言中的 view plaincopy to clipboardprint?in basic io.h define memery size 26 typedef enum var...

表示式求值

寫了乙個下午,各種糾結,各種問,終於搞明白了。但是自己還是想出來的一點東西的。很爽歪歪的,哈哈。先貼第一次的 include include include include include includeusing namespace std char data 7 7 int sign char ...