表示式求值——————Python大法好!
阿新 • • 發佈:2019-01-04
樸素的表示式求值演算法
加減乘除,用py來寫的
用雙棧來實現就可以
我後續會進行C/C++程式碼的補充;
先來看一下python的寫法
第一種
直接模擬雙棧,python的寫法比較簡單一下
def compare(op1, op2):
"""
比較兩個運算子的優先順序,乘除運算優先順序比加減高
op1優先順序比op2高返回True,否則返回False
"""
return op1 in ["*", "/"] and op2 in ["+", "-"]
def getvalue(num1, num2, operator):
"""
根據運算子號operator計算結果並返回
"""
if operator == "+":
return num1 + num2
elif operator == "-":
return num1 - num2
elif operator == "*":
return num1 * num2
else: # /
return num1 // num2
def process(data, opt):
"""
opt出棧一個運算子,data出棧兩個數值,進行一次計算,並將結果入棧data
"""
operator = opt. pop()
num2 = data.pop()
num1 = data.pop()
data.append(getvalue(num1, num2, operator))
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
data.append(int(s[start: i + 1])) # i為最後一個數字字元的位置
elif s[i] == ")": # 右括號,opt出棧同時data出棧並計算,計算結果入棧data,直到opt出棧一個左括號
while opt[-1] != "(":
process(data, opt)
opt.pop() # 出棧"("
elif not opt or opt[-1] == "(": # 操作符棧為空,或者操作符棧頂為左括號,操作符直接入棧opt
opt.append(s[i])
elif s[i] == "(" or compare(s[i], opt[-1]): # 當前操作符為左括號或者比棧頂操作符優先順序高,操作符直接入棧opt
opt.append(s[i])
else: # 優先順序不比棧頂操作符高時,opt出棧同時data出棧並計算,計算結果如棧data
while opt and not compare(s[i], opt[-1]):
if opt[-1] == "(": # 若遇到左括號,停止計算
break
process(data, opt)
opt.append(s[i])
i += 1 # 遍歷索引後移
while opt:
process(data, opt)
print(data.pop())
if __name__ == '__main__':
#exp = "(9+((3-1)*3+10/2))*2"
exp = input()
calculate(exp)
第二種
利用eval…
s = input()
print(eval(s))
比如上次在我們學校OJ上做的一道題,用py寫非常非常簡單
C. Max and Min
來看看py的程式碼,所以說用py來寫表示式求值的問題還是比較簡單的
def Max(a,b):
return max(a,b)
def Min(a,b):
return min(a,b)
while True:
try:
s = input()
print(eval(s))
except EOFError:
break
當然,南陽OJ上也有表示式求值的問題,回頭我給補充一下,剛剛不能打開了…