本文根据严蔚敏老师数据结构(c语言版) 写的程序 如有需要先去看视频 如有错误不当之处,欢迎指出,以免害人害己。
例子
Exp = a * b + ( c – d / e )* f
前缀式:+ * a b * - c / d e f
中缀式:a * b + c–d / e * f
后缀式:a b * cd e /-f * +
相同点
数字都是按原式子排列的:因此操作数就按顺序入栈就好了
不同点
1:后缀式中运算符的顺序,正好就是求解的顺序
2:每个运算符和它之前出现且紧靠它的2个操作数构成一个最小表达式
关键:就是由原表达式求得后缀式
应用步骤
- Step1: 先设立两个栈,一个运算符栈,另一个后缀式栈。
- Step2:在表达式前后头尾加入=号,表示运算表达式开始和结束,因此在运算符中,=号优先级最低。
- Step3:若当前字符是操作数,则直接发送给后缀式栈。符合上面提到的共同点:数字按原表达式从左自右的顺序。
- Step4:左括号的优先级高于左括号前的运算符,左括号后的运算符优先级高于左括号,这样才能起到隔离的作用,则右括号前的运算符高于右括号,这样才能起到括号隔离内层表达式的作用!
- Step5:若当前运算符的优先级高于栈顶的运算符,则进运算符栈,否则退出运算符栈的栈顶运算符与从操作数栈栈顶取出的两个操作数运算结果作为新的操作数压入操作数栈,然后再把当前运算符入运算符栈。
源代码
1 |
|