Skip to content

24588: 后序表达式求值

http://cs101.openjudge.cn/practice/24588/

后序表达式由操作数和运算符构成。操作数是整数或小数,运算符有 + - * / 四种,其中 * / 优先级高于 + -。后序表达式可用如下方式递归定义:

  1. 一个操作数是一个后序表达式。该表达式的值就是操作数的值。
  2. 若a,b是后序表达式,c是运算符,则"a b c"是后序表达式。“a b c”的值是 (a) c (b),即对a和b做c运算,且a是第一个操作数,b是第二个操作数。下面是一些后序表达式及其值的例子(操作数、运算符之间用空格分隔):

3.4 值为:3.4 5 值为:5 5 3.4 + 值为:5 + 3.4 5 3.4 + 6 / 值为:(5+3.4)/6 5 3.4 + 6 * 3 + 值为:(5+3.4)*6+3

输入

第一行是整数n(n<100),接下来有n行,每行是一个后序表达式,长度不超过1000个字符

输出

对每个后序表达式,输出其值,保留小数点后面2位

样例输入

3
5 3.4 +
5 3.4 + 6 /
5 3.4 + 6 * 3 +

样例输出

8.40
1.40
53.40

来源: Guo wei

要解决这个问题,需要理解如何计算后序表达式。后序表达式的计算可以通过使用一个栈来完成,按照以下步骤:

  1. 从左到右扫描后序表达式。
  2. 遇到数字时,将其压入栈中。
  3. 遇到运算符时,从栈中弹出两个数字,先弹出的是右操作数,后弹出的是左操作数。将这两个数字进行相应的运算,然后将结果压入栈中。
  4. 当表达式扫描完毕时,栈顶的数字就是表达式的结果。
python
def evaluate_postfix(expression):
    stack = []
    tokens = expression.split()
    
    for token in tokens:
        if token in '+-*/':
            # 弹出栈顶的两个元素
            right_operand = stack.pop()
            left_operand = stack.pop()
            # 执行运算
            if token == '+':
                stack.append(left_operand + right_operand)
            elif token == '-':
                stack.append(left_operand - right_operand)
            elif token == '*':
                stack.append(left_operand * right_operand)
            elif token == '/':
                stack.append(left_operand / right_operand)
        else:
            # 将操作数转换为浮点数后入栈
            stack.append(float(token))
    
    # 栈顶元素就是表达式的结果
    return stack[0]

# 读取输入行数
n = int(input())

# 对每个后序表达式求值
for _ in range(n):
    expression = input()
    result = evaluate_postfix(expression)
    # 输出结果,保留两位小数
    print(f"{result:.2f}")

这个程序将读取输入行数,然后对每行输入的后序表达式求值,并按要求保留两位小数输出结果。