C语言实现表达式运算优先级判断与计算

需积分: 16 3 下载量 167 浏览量 更新于2024-10-09 收藏 3KB TXT 举报
"该代码实现了一个简单的表达式求值器,使用了两个堆栈,一个用于存储操作符(OPTR),另一个用于存储操作数(OPND)。表达式的运算优先级通过二维数组B来确定,遵循典型的算术运算符优先级规则。程序从输入读取字符表达式,直到遇到结束符号'#',然后根据运算符优先级进行计算,最后输出表达式的值。" 在编程中,表达式求值是处理数学或逻辑表达式以获得结果的重要过程。此代码使用堆栈数据结构来处理中缀表达式,即运算符位于操作数之间的表达式。堆栈是一种后进先出(LIFO)的数据结构,非常适合解决此类问题。 1. **堆栈定义**:代码定义了两个堆栈结构,`stack1` 和 `stack2`。`stack1` 存储运算符,`stack2` 存储操作数。每个堆栈都有 `top` 指针表示顶部元素的位置,`base` 指针表示堆栈底部。 2. **初始化堆栈**:`Initstack1` 和 `Initstack2` 函数分别用于初始化运算符堆栈和操作数堆栈,将 `top` 和 `base` 都设置为0。 3. **运算符优先级表**:数组 `B` 定义了运算符的优先级,例如 '*' 和 '/' 的优先级高于 '+' 和 '-','(' 和 ')' 的优先级最高。 4. **运算符优先级判断**:`precede` 函数根据 `B` 表计算两个运算符的相对优先级,返回值表示运算符 `c1` 相对于 `c2` 的优先级关系('<' 表示 `c1` 优先级低,'=' 表示相同,'>' 表示 `c1` 优先级高)。 5. **入栈操作**:`push1` 和 `push2` 分别用于将运算符和操作数压入对应堆栈。 6. **出栈操作**:`pop1` 和 `pop2` 用于从堆栈中弹出顶部元素。如果堆栈为空,则返回特殊字符表示错误。 7. **获取堆栈顶部元素**:`gettop1` 和 `gettop2` 返回堆栈顶部的元素,但不将其移除。 8. **主程序**:`main` 函数中,用户输入的表达式字符被逐个处理。遇到数字时,它们被转换为整数并压入操作数堆栈;遇到运算符时,根据其与堆栈顶部运算符的优先级关系进行相应的操作,如压栈、弹栈或执行计算。 9. **操作数计算**:`operate` 函数根据给定的操作符执行相应的数学运算,如加法、减法、乘法或除法。 最终,当输入结束符 '#' 或运算符堆栈为空时,程序从操作数堆栈中弹出最后一个元素作为表达式的结果,并输出。这个程序展示了如何利用堆栈解决逆波兰表示法(RPN)之外的中缀表达式求值问题。