中缀表达式是一种常见的数学表达式表示方法,它将操作符放在两个操作数的中间。例如,中缀表达式 "2 + 3" 表示将两个数相加。
中缀表达式求值的一般算法如下:
- 建立一个栈,用于存储操作数和运算符。
- 从左到右扫描中缀表达式。
- 如果当前字符是一个数字,将其推入栈中作为操作数。
- 如果当前字符是一个运算符(例如 +、-、*、/),从栈顶弹出两个操作数,执行相应的运算操作,将结果推入栈中。
- 如果当前字符是一个左括号 '(',将其推入栈中。
- 如果当前字符是一个右括号 ')',从栈顶弹出运算符和操作数,执行相应的运算操作,将结果推入栈中。
- 重复步骤 3 到 6,直到扫描完整个中缀表达式。
- 最后,栈中应该只剩下一个元素,即为中缀表达式的求值结果。
以下是一个简单的 Python 代码示例,用于求解中缀表达式 "2 + 3* 4 - 5 / 6":
- def evaluate_expression(expression):
- ????stack = []
- ????for token in expression:
- ????????if token.isdigit():
- ????????????stack.append(int(token))
- ????????elif token in '+-*/':
- ????????????operand2 = stack.pop()
- ????????????operand1 = stack.pop()
- ????????????if token == '+': result = operand1 + operand2
- ????????????elif token == '-': result = operand1 - operand2
- ????????????elif token == '*': result = operand1 * operand2
- ????????????elif token == '/': result = operand1 / operand2
- ????????????stack.append(result)
- ????return stack.pop()
在这个例子中,我们使用一个栈来存储操作数和运算符。当遇到一个数字时,我们将其推入栈中。当遇到一个运算符时,我们从栈顶弹出两个操作数,执行相应的运算操作,将结果推入栈中。最后,栈中只剩下一个元素,即为求值结果。
除了简单的中缀表达式求值之外,还可以实现更复杂的功能,例如处理带有括号的中缀表达式、处理错误输入等。
处理带有括号的中缀表达式时,可以在遇到左括号时将当前子表达式(包括左括号和右括号之间的内容)压入栈中,并在遇到右括号时弹出栈顶的子表达式,执行相应的运算操作,将结果推入栈中。
为了处理错误输入,可以在代码中添加异常处理语句,例如使用 try-except 语句捕获异常并进行相应的处理。此外,还可以在遇到错误输入时输出错误信息,以便用户知道哪个部分的输入有误。
以下是一个更完整的 Python 代码示例,用于求解中缀表达式 "((2 + 3) * 4) - 5 / 6":
- def evaluate_expression(expression):
- ????stack = []
- ????for token in expression:
- ????????if token.isdigit():
- ????????????stack.append(int(token))
- ????????elif token in '+-*/()':
- ????????????if token == '(':
- ????????????????stack.append(token)
- ????????????elif token == ')':
- ????????????????while stack and stack[-1] != '(':
- ????????????????????operand2 = stack.pop()
- ????????????????????operand1 = stack.pop()
- ????????????????????if token == '+': result = operand1 + operand2
- ????????????????????elif token == '-': result = operand1 - operand2
- ????????????????????elif token == '*': result = operand1 * operand2
- ????????????????????elif token == '/': result = operand1 / operand2
- ????????????????????stack.append(result)
- ????????????else:
- ????????????????operand2 = stack.pop()
- ????????????????operand1 = stack.pop()
- ????????????????if token == '+': result = operand1 + operand2
- ????????????????elif token == '-': result = operand1 - operand2
- ????????????????elif token == '*': result = operand1 * operand2
- ????????????????elif token == '/': result = operand1 / operand2
- ????????????????stack.append(result)
- ????return stack.pop()
在这个例子中,我们使用一个栈来存储操作数和运算符。当遇到一个左括号时,我们将当前子表达式(包括左括号和右括号之间的内容)压入栈中。当遇到一个右括号时,我们从栈顶弹出左括号及其后面的子表达式,执行相应的运算操作,将结果推入栈中。最后,栈中只剩下一个元素,即为求值结果。