中缀表达式求值

中缀表达式是一种常见的数学表达式表示方法,它将操作符放在两个操作数的中间。例如,中缀表达式 "2 + 3" 表示将两个数相加。

中缀表达式求值的一般算法如下:

  1. 建立一个栈,用于存储操作数和运算符。
  2. 从左到右扫描中缀表达式。
  3. 如果当前字符是一个数字,将其推入栈中作为操作数。
  4. 如果当前字符是一个运算符(例如 +、-、*、/),从栈顶弹出两个操作数,执行相应的运算操作,将结果推入栈中。
  5. 如果当前字符是一个左括号 '(',将其推入栈中。
  6. 如果当前字符是一个右括号 ')',从栈顶弹出运算符和操作数,执行相应的运算操作,将结果推入栈中。
  7. 重复步骤 3 到 6,直到扫描完整个中缀表达式。
  8. 最后,栈中应该只剩下一个元素,即为中缀表达式的求值结果。

以下是一个简单的 Python 代码示例,用于求解中缀表达式 "2 + 3* 4 - 5 / 6":

  1. def evaluate_expression(expression):
  2.     stack = []
  3.     for token in expression:
  4.         if token.isdigit():
  5.             stack.append(int(token))
  6.         elif token in '+-*/':
  7.             operand2 = stack.pop()
  8.             operand1 = stack.pop()
  9.             if token == '+': result = operand1 + operand2
  10.             elif token == '-': result = operand1 - operand2
  11.             elif token == '*': result = operand1 * operand2
  12.             elif token == '/': result = operand1 / operand2
  13.             stack.append(result)
  14.     return stack.pop()

在这个例子中,我们使用一个栈来存储操作数和运算符。当遇到一个数字时,我们将其推入栈中。当遇到一个运算符时,我们从栈顶弹出两个操作数,执行相应的运算操作,将结果推入栈中。最后,栈中只剩下一个元素,即为求值结果。

除了简单的中缀表达式求值之外,还可以实现更复杂的功能,例如处理带有括号的中缀表达式、处理错误输入等。

处理带有括号的中缀表达式时,可以在遇到左括号时将当前子表达式(包括左括号和右括号之间的内容)压入栈中,并在遇到右括号时弹出栈顶的子表达式,执行相应的运算操作,将结果推入栈中。

为了处理错误输入,可以在代码中添加异常处理语句,例如使用 try-except 语句捕获异常并进行相应的处理。此外,还可以在遇到错误输入时输出错误信息,以便用户知道哪个部分的输入有误。

以下是一个更完整的 Python 代码示例,用于求解中缀表达式 "((2 + 3) * 4) - 5 / 6":

  1. def evaluate_expression(expression):
  2.     stack = []
  3.     for token in expression:
  4.         if token.isdigit():
  5.             stack.append(int(token))
  6.         elif token in '+-*/()':
  7.             if token == '(':
  8.                 stack.append(token)
  9.             elif token == ')':
  10.                 while stack and stack[-1] != '(':
  11.                     operand2 = stack.pop()
  12.                     operand1 = stack.pop()
  13.                     if token == '+': result = operand1 + operand2
  14.                     elif token == '-': result = operand1 - operand2
  15.                     elif token == '*': result = operand1 * operand2
  16.                     elif token == '/': result = operand1 / operand2
  17.                     stack.append(result)
  18.             else:
  19.                 operand2 = stack.pop()
  20.                 operand1 = stack.pop()
  21.                 if token == '+': result = operand1 + operand2
  22.                 elif token == '-': result = operand1 - operand2
  23.                 elif token == '*': result = operand1 * operand2
  24.                 elif token == '/': result = operand1 / operand2
  25.                 stack.append(result)
  26.     return stack.pop()

在这个例子中,我们使用一个栈来存储操作数和运算符。当遇到一个左括号时,我们将当前子表达式(包括左括号和右括号之间的内容)压入栈中。当遇到一个右括号时,我们从栈顶弹出左括号及其后面的子表达式,执行相应的运算操作,将结果推入栈中。最后,栈中只剩下一个元素,即为求值结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

crmeb专业二开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值