1. 程式人生 > >表示式求值——————Python大法好!

表示式求值——————Python大法好!

樸素的表示式求值演算法

加減乘除,用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上也有表示式求值的問題,回頭我給補充一下,剛剛不能打開了…