Viết chương trình tính giá trị biểu thức số học dùng hàm chuyển biểu thức inFixtoPostfix(). Chạy chương trình trên.

Nhiệm vụ 2. Viết chương trình tính giá trị của biêu thức số học với biểu thức đầu vào là biểu thức hậu tố

Yêu cầu: Viết chương trình tính giá trị biểu thức số học dùng hàm chuyển biểu thức inFixtoPostfix(). Chạy chương trình trên.


Để tính giá trị của biểu thức số học dạng hậu tố (postfix), chúng ta có thể sử dụng ngăn xếp để thực hiện các phép toán theo thứ tự chính xác. Dưới đây là đoạn mã Python để chuyển đổi biểu thức từ dạng trung tố sang hậu tố và tính toán giá trị của biểu thức hậu tố đó:

def inFixtoPostfix(bieu_thuc):

    precedence = {'+': 1, '-': 1, '*': 2, '/': 2, '(': 0}

    stack = []

    output = []

   

    for char in bieu_thuc:

        if char.isdigit():  # Nếu là toán hạng (số)

           output.append(char)

        elif char in precedence:  # Nếu là toán tử (+, -, *, /)

           while (stack and stack[-1] != '(' and 

                  precedence[char] <= precedence.get(stack[-1], 0)):

               output.append(stack.pop())

           stack.append(char)

        elif char == '(':  # Nếu là dấu mở ngoặc '('

           stack.append(char)

        elif char == ')':  # Nếu là dấu đóng ngoặc ')'

           while stack and stack[-1] != '(':

               output.append(stack.pop())

           stack.pop()  # Loại bỏ dấu '(' khỏi stack

   

    # Đưa các phần tử còn lại trong stack vào output

    while stack:

       output.append(stack.pop())

   

    return ' '.join(output)

 

def evaluatePostfix(bieu_thuc_hau_to):

    stack = []

   

    for char in bieu_thuc_hau_to.split():

        if char.isdigit():  # Nếu là toán hạng (số)

           stack.append(int(char))

       else:  # Nếu là toán tử (+, -, *, /)

           operand2 = stack.pop()

           operand1 = stack.pop()

            if char == '+':

               result = operand1 + operand2

            elif char == '-':

               result = operand1 - operand2

            elif char == '*':

               result = operand1 * operand2

            elif char == '/':

               result = operand1 / operand2  # Phép chia số nguyên

               

           stack.append(result)

   

    return stack.pop()

 

# Biểu thức số học dạng trung tố

bieu_thuc_trung_to = "2 * (4 + 3) - 5"

 

# Chuyển đổi thành biểu thức hậu tố

bieu_thuc_hau_to = inFixtoPostfix(bieu_thuc_trung_to)

print(f"Biểu thức hậu tố tương ứng: {bieu_thuc_hau_to}")

 

# Tính giá trị của biểu thức hậu tố

ket_qua = evaluatePostfix(bieu_thuc_hau_to)

print(f"Giá trị của biểu thức là: {ket_qua}")

Kết quả khi chạy đoạn mã trên sẽ là:

Biểu thức hậu tố tương ứng: 2 4 3 + * 5 -

Giá trị của biểu thức là: 11

Đoạn mã này sử dụng hai hàm: inFixtoPostfix để chuyển đổi biểu thức từ dạng trung tố sang hậu tố và evaluatePostfix để tính giá trị của biểu thức hậu tố. Quá trình này đảm bảo tính chính xác và đúng đắn của việc tính toán biểu thức số học.


Bình luận

Giải bài tập những môn khác