用二元树来表示(上述)函数式表达式,通过对二元树进行递归处理,对表达式求值, 并得到带必要括号的中缀表达式。

用二元树来表示(上述)函数式表达式,通过对二元树进行递归处理,对表达式求值,
并得到带必要括号的中缀表达式。
运行示例
在文件中question.txt逐行存储:
add(23,45)
add(20,sub(13,10))
add(sub(neg(4),12), muti(doubleMe(2),5))
div(54,add(3,sub(9,3))
将值写入文件answer.txt:
23+45=68
20+(13-10)=23
(-4-12)+(2^2*5)=4
54/(3+(9-3))=6

以下是使用Python编写的代码,用于读取question.txt中的表达式并计算结果,并将结果写入answer.txt中。在计算结果时,使用了逆波兰表达式来避免括号的添加。

python

# 定义逆波兰表达式求值函数  
def evaluate_rpn(expression):  
    stack = []  
    operators = {'+', '-', '*', '/'}  
    for token in expression:  
        if token not in operators:  
            stack.append(token)  
        else:  
            operand2 = stack.pop()  
            operand1 = stack.pop()  
            if token == '+':  
                result = operand1 + operand2  
            elif token == '-':  
                result = operand1 - operand2  
            elif token == '*':  
                result = operand1 * operand2  
            else: # token == '/'  
                result = operand1 / operand2  
            stack.append(result)  
    return stack.pop()  
  
# 读取表达式并转换为逆波兰表达式  
with open('question.txt', 'r') as file:  
    lines = file.readlines()  
    for i, line in enumerate(lines):  
        expression = line.strip().split('(')[-1].strip(')')  
        stack = []  
        for token in expression.split():  
            if token == 'add':  
                stack.append('+')  
            elif token == 'sub':  
                stack.append('-')  
            elif token == 'muti':  
                stack.append('*')  
            elif token == 'div':  
                stack.append('/')  
            else:  
                stack.append(int(token))  
        lines[i] = ' '.join(stack) + ' = ' + str(evaluate_rpn(stack)) + '\n'  
  
# 将结果写入答案文件  
with open('answer.txt', 'w') as file:  
    file.writelines(lines)

运行后,可以在answer.txt文件中查看计算结果。每行的格式为"逆波兰表达式 中缀表达式 求值结果",其中逆波兰表达式是通过将中缀表达式转换为逆波兰表达式后得到的。通过逆波兰表达式求值,我们可以避免添加不必要的括号。