據結構(四) 用棧實現表示式計算

2021-09-19 10:12:51 字數 1781 閱讀 1325

《資料結構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,也叫逆波蘭式 是最容易計算的,這種表示式中已經不含括號.方法 遇到運算元時壓入棧中 遇到操作符時從棧中彈出兩個元素進行此運算,再將運算結...