《資料結構c語言版》p52-54
演算法思想
用兩個棧(列表實現),optr存放運算子,opnd存放數值。
optr棧底預先放入乙個『#』(結束符),表示式的最後乙個結束符『#』。
依次讀表示式中的每個字元,若是運算元則進opnd棧,若是運算子,則和optr棧的棧頂運算子比較優先權後作相應操作,直至整個表示式求值完畢(使用到optr棧不為空的條件)。
python3
def precede(op1, op2): # 比較讀入的當前運算子和棧頂的運算子的優先順序
array = [
#'+' '-' '*' '/' '(' ')' '#'
['>', '>', '<', '<', '<', '>', '>'], #'+'
['>', '>', '<', '<', '<', '>', '>'], #'-'
['>', '>', '>', '>', '<', '>', '>'], #'*'
['>', '>', '>', '>', '<', '>', '>'] #'/'
['<', '<', '<', '<', '<', '=', ''], #'('
['>', '>', '>', '>', '', '>', '>'], #')'
['<', '<', '<', '<', '<', '', '='] #'#'
]index =
return array[index[op1]][index[op2]]
def evaluateexpression(expression):
optr = ['#'] # 棧底預先放乙個『#』
opnd =
i = 0
op = ['+', '-', '*', '/', '(', ')', '#'] # 表示式中除了這些符號其餘都放入opnd棧
while optr:
if expression[i] not in op:
i += 1
continue
optrinstack = optr.pop()
if precede(optrinstack, expression[i]) == '<': # 棧頂運算子小於當前讀入運算子,兩個都入棧,且讀下乙個
i += 1
elif precede(optrinstack, expression[i]) == '>': # 棧頂運算子大於當前讀入運算子,棧頂運算子出棧和opnd**棧的兩個數字進行運算,不讀下乙個!
a = opnd.pop()
b = opnd.pop()
if optrinstack == '+':
c = a + b
elif optrinstack == '-':
c = a - b
elif optrinstack == '*':
c = a * b
elif optrinstack == '/':
c = a / b
elif precede(optrinstack, expression[i]) == '=': # 當當前讀入的是')'且棧頂元素是'('或者當前讀入的是'#'且棧頂元素是'#',直接消去棧頂元素,且讀下乙個
i += 1
return opnd.pop()
if __name__ == '__main__':
exp = '(1+2)/3#'
t = evaluateexpression(exp)
print(t)
用棧實現表示式計算
public class calculator public static inthandle string express else else else else int num integer.parseint keepnum keepnum numstack.push num index if...
用棧實現表示式計算 C
思路 1.首先建立倆個棧,乙個存資料 datastack 另乙個存運算子 operatorstack 2.表示式計算 資料 datasatck,運算子 operatorstack if 當運算子棧為空時 將第乙個運算子放入棧中 else if 此時的運算子的優先順序 棧頂的運算子優先順序 運算子入棧...
用棧計算表示式
首先宣告我們的表示式 expression 只是簡單的四則運算,再加上小括號.運算元operand,操作符operator 如果直接給出字尾表示式 postfix,也叫逆波蘭式 是最容易計算的,這種表示式中已經不含括號.方法 遇到運算元時壓入棧中 遇到操作符時從棧中彈出兩個元素進行此運算,再將運算結...