Java实现四则混合运算:栈解析代码示例

1 下载量 43 浏览量 更新于2024-09-05 1 收藏 46KB PDF 举报
"Java实现四则混合运算代码示例,使用栈处理运算优先级,无需将表达式转换为逆波兰表示。" 在Java编程中,处理四则混合运算(加、减、乘、除)通常涉及到解析数学表达式并考虑运算符的优先级。这个例子中,使用了栈数据结构来解决这个问题。栈是一种后进先出(LIFO)的数据结构,非常适合处理具有优先级的运算符。以下是对给定代码的详细解释: 1. **栈的使用**: - `numStack` 存储操作数(数字),在遇到运算符时,会将当前操作数压入栈中。 - `opStack` 存储运算符,遵循运算符的优先级规则。例如,乘法和除法的优先级高于加法和减法。 2. **代码结构**: - 类 `Calculator` 包含两个栈,一个用于存储数字,一个用于存储运算符。 - 类中定义了一些私有变量,如 `currentOperator`、`opStackTop`、`i` 和 `expression`,分别用于跟踪当前运算符、栈顶运算符、遍历索引和表达式字符串。 3. **方法 `exec`**: - 这是主方法,接受一个字符串形式的表达式,然后进行计算。 - 首先清理栈,然后检查输入表达式是否为空。 - 在表达式末尾添加结束标记,以处理表达式的边界情况。 - 使用分词器(`TOKENIZER`,未在给出的代码中定义)将表达式分割成操作数和运算符的列表。 - 遍历这个列表,对于每个元素: - 如果是数字,就压入 `numStack`。 - 如果是运算符,根据运算符的优先级与栈顶运算符的优先级进行比较,决定是否立即执行运算。 4. **运算符处理**: - 当遇到新的运算符时,会比较其与栈顶运算符的优先级。如果新运算符优先级更高,或栈为空,或者栈顶运算符是左括号,那么新运算符压入 `opStack`。 - 否则,弹出 `opStack` 的运算符,与 `numStack` 的顶部两个操作数进行运算,结果再压回 `numStack`。 - 左括号被特殊处理,它们会被压入 `opStack`,直到遇到对应的右括号,然后进行连续的运算,直到栈中没有更高的优先级运算符。 5. **异常处理**: - 如果表达式为空,会抛出 `IllegalArgumentException`。 通过这种方式,Java代码可以解析并计算复杂的四则混合表达式,同时考虑了运算符的优先级和括号的嵌套。这个实现简化了表达式解析的过程,不需要预先转换为逆波兰表示或其他中间形式,提高了代码的可读性和效率。