中缀转后缀需要处理的有:
1. 操作数,操作符的提取
2. 括号等关系到运算符优先级的符号
3. 一元操作符(如 +(正), -(负)) 等
4. 操作符和操作数的匹配,括号的匹配,(函数参数的个数是否正确等)
基本思路如下:
用一个链表 List 储存将要生成的后缀表达式
用一个栈 Stack 储存操作符
判断当前节点, 如果是操作数, 直接加入后缀表达式中, 如果是操作符,则比较前一个操作符和当前操作符的优先级,
如果前一个操作符优先级较高,则将前一个操作符加入后缀表达式中,否则将操作符压入操作符栈(从顶到栈底),如果遇到反括号 ')', 则在操作符栈中反向搜索,直到遇到匹配的正括号为止,将中间的操作符依次加到后缀表达式中。
举例: 15+25*2, 共有 15, +, 25, *, 2 五个符号,下面一步步列出每一步操作
第六步:没有符号了,直接将操作符栈中剩余的依次加到表达式中,最终的结果
那假如括号呢例如 (15 + 25) * 2, 共有7个符号,每一步的操作为
第一步: 左括号直接压入操作符栈
操作符栈 | ( |
后缀表达式 | 空 |
第二步:数字加入表达式中
操作符栈 | ( |
后缀表达式 | 15 |
第三步:+号压入操作符栈
操作符栈 | ( + |
后缀表达式 | 15 |
第四步:数字加入表达式中
操作符栈 | ( + |
后缀表达式 | 15 25 |
第五步:遇到反括号了,将两个括号之间操作符依次加入到表达式中,并删除匹配的正括号
操作符栈 | 空 |
后缀表达式 | 15 25 + |
第六步:*号压入操作符栈
操作符栈 | * |
后缀表达式 | 15 25 + |
第七步:数字加入表达式中
操作符栈 | * |
后缀表达式 | 15 25 + 2 |
第八步:没有符号了,直接将操作符栈中剩余的依次加到表达式中,最终的结果
操作符栈 | 空 |
后缀表达式 | 15 25 + 2 * |
这样就可以看出优先级对表达式的影响。
//以上转自Internet..........
注:对于+,-作为一无运算符时,优先级较高(仅低于'('),可转化为另一符号,以与 其二元相区别.
对于后缀表达式的计算:
如:15 25 + 2 *
顺序扫描运算符,若发现运算符 A,就对紧邻其前的数据进行运算,并以新的结果替换原操作数(若A是一元,则将其前操作数operand1=( A operand1 ), 若A是二元的,则 operand1 = operand1 A operand2 , delete operand2 ..}, 同时删除此运算符....
对中缀表达式的另一种计算方法:
利用一个栈计录运算符,另一栈记录操作数,边扫描边计算或压栈....(数据结构-来蔚敏)