中缀表达式求值

2023-12-21 13:47:07

中缀表达式是一种常见的数学表达式表示方法,它将操作符放在两个操作数的中间。例如,中缀表达式 "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()

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

文章来源:https://blog.csdn.net/jiazi1024/article/details/135122644
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。