考慮運算符的優先順序(乘除優先於加減),可以使用「中序轉後序」的技巧,即將中序表達式(如 1 + 2 * 3
)轉換為後序表達式(如 1 2 3 * +
),然後再依照後序表達式的順序來進行計算。
這裡,我將提供一個完整的程式碼,首先把中序表達式轉換為後序表達式,然後對後序表達式進行計算:
程式碼
# 輸入數學表達式,例如:"1 + 2 * 3"
expression = input("輸入數學表達式,例如 '1 + 2 * 3': ")
# 步驟 1:把數字和符號分開
tokens = []
for i in expression.split():
if i.isdigit(): # 如果 i 是數字
tokens.append(int(i)) # 把數字轉為 int 並加入 tokens
else:
tokens.append(i) # 把符號直接加到 tokens
# 儲存後序表達式的結果
output = []
# 儲存運算符的堆疊
operators = []
# 定義運算符的優先順序
precedence = {'+': 1, '-': 1, '*': 2, '/': 2}
# 步驟 2:轉換為後序表達式
for token in tokens:
if type(token) == int: # 如果是數字
output.append(token) # 直接加入輸出
else: # 如果是運算符
# 當堆疊中的運算符優先順序比當前運算符高或相等,彈出它們
while operators and precedence[operators[-1]] >= precedence[token]:
output.append(operators.pop())
operators.append(token) # 把當前運算符推入堆疊
# 把剩下的運算符都彈出
while operators:
output.append(operators.pop())
# 後序表達式已生成
print("後序表達式:", output)
# 步驟 3:計算後序表達式的結果
stack = []
for token in output:
if type(token) == int: # 如果是數字,推入堆疊
stack.append(token)
else: # 如果是運算符,取出兩個數字計算
b = stack.pop() # 堆疊頂部的數字為 b
a = stack.pop() # 再取出一個數字為 a
if token == '+':
stack.append(a + b)
elif token == '-':
stack.append(a - b)
elif token == '*':
stack.append(a * b)
elif token == '/':
stack.append(a / b) # 確保除數不為 0
# 最後堆疊中只剩一個結果,即為最終計算結果
result = stack[0]
print("結果:", result)
程式說明
解析輸入:把數字和運算符分開,並存入
tokens
列表中。數字轉為int
,而運算符則保留為字串。轉換為後序表達式:
- 我們使用一個
output
列表來存儲後序表達式,並使用operators
堆疊來管理運算符的優先順序。 - 當遇到運算符(例如
+
,-
,*
,/
)時,先比較堆疊頂端運算符的優先順序,若優先順序高或相等,就彈出堆疊頂部運算符並加入到output
。 - 當前運算符推入
operators
堆疊。 - 這樣做的目的是讓乘除優先於加減,並在後序表達式中表現出來。
- 我們使用一個
計算後序表達式:
- 使用
stack
堆疊來計算後序表達式。 - 遇到數字時,直接推入
stack
。 - 遇到運算符時,彈出兩個數字,依次計算並把結果推回堆疊。
- 最後,
stack
中唯一剩下的數字就是計算結果。
- 使用
範例執行
輸入:
1 + 2 * 3
執行過程:
tokens
被解析為[1, '+', 2, '*', 3]
- 轉換後的後序表達式:
[1, 2, 3, '*', '+']
- 後序計算:
2 * 3 = 6
1 + 6 = 7
輸出:
後序表達式: [1, 2, 3, '*', '+']
結果: 7
沒有留言:
張貼留言