2024年10月29日 星期二

考慮運算符優先順序

 考慮運算符的優先順序(乘除優先於加減),可以使用「中序轉後序」的技巧,即將中序表達式(如 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)

程式說明

  1. 解析輸入:把數字和運算符分開,並存入 tokens 列表中。數字轉為 int,而運算符則保留為字串。

  2. 轉換為後序表達式

    • 我們使用一個 output 列表來存儲後序表達式,並使用 operators 堆疊來管理運算符的優先順序。
    • 當遇到運算符(例如 +-*/)時,先比較堆疊頂端運算符的優先順序,若優先順序高或相等,就彈出堆疊頂部運算符並加入到 output
    • 當前運算符推入 operators 堆疊。
    • 這樣做的目的是讓乘除優先於加減,並在後序表達式中表現出來。
  3. 計算後序表達式

    • 使用 stack 堆疊來計算後序表達式。
    • 遇到數字時,直接推入 stack
    • 遇到運算符時,彈出兩個數字,依次計算並把結果推回堆疊。
    • 最後,stack 中唯一剩下的數字就是計算結果。

範例執行

輸入:

1 + 2 * 3

執行過程:

  1. tokens 被解析為 [1, '+', 2, '*', 3]
  2. 轉換後的後序表達式:[1, 2, 3, '*', '+']
  3. 後序計算:
    • 2 * 3 = 6
    • 1 + 6 = 7

輸出:

後序表達式: [1, 2, 3, '*', '+']
結果: 7

沒有留言:

張貼留言