今天把表示式求值給搞定吧。
問題:給你個表示式,有加減乘除和小括號,讓算出結果。
我們假定計算式是正確的,並且不會出現除數為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 ...