中缀转后缀需要处理的有:
1. 操作数,操作符的提取
2. 括号等关系到运算符优先级的符号
3. 一元操作符(如 +(正), -(负)) 等
4. 操作符和操作数的匹配,括号的匹配,(函数参数的个数是否正确等)
基本思路如下:
用一个链表 List<ExpressionToken> 储存将要生成的后缀表达式
用一个栈 Stack<OperatorType> 储存操作符
判断当前节点, 如果是操作数, 直接加入后缀表达式中, 如果是操作符,则比较前一个操作符和当前操作符的优先级,
如果前一个操作符优先级较高,则将前一个操作符加入后缀表达式中,否则将操作符压入操作符栈,如果遇到反括号 ')', 则在操作符栈中反向搜索,直到遇到匹配的正括号为止,将中间的操作符依次加到后缀表达式中。
举例: 15+25*2, 共有 15, +, 25, *, 2 五个符号,下面一步步列出每一步操作
第一步: 数字加入后缀表达式
操作符栈 空
后缀表达式 15
第二步:+ 号 压入操作符栈
操作符栈 +
后缀表达式 15
第三步:
操作符栈 +
后缀表达式 15 25
第四步:是一个*号,因为*号的优先级比+号高,所以直接压入操作符栈中
操作符栈 + *
后缀表达式 15 25
第五步:
操作符栈 + *
后缀表达式 15 25 2
第六步:没有符号了,直接将操作符栈中剩余的依次加到表达式中,最终的结果
操作符栈 空
后缀表达式 15 25 2 * +
那假如括号呢?例如 (15 + 25) * 2, 共有7个符号,每一步的操作为
第一步: 左括号直接压入操作符栈
操作符栈 (
后缀表达式 空
第二步:数字加入表达式中
操作符栈 (
后缀表达式 15
第三步:+号压入操作符栈
操作符栈 ( +
后缀表达式 15
第四步:数字加入表达式中 操作符栈 ( +
后缀表达式 15 25
第五步:遇到反括号了,将两个括号之间操作符依次加入到表达式中,并删除匹配的正括号
操作符栈 空
后缀表达式 15 25 +
第六步:*号压入操作符栈
操作符栈 *
后缀表达式 15 25 +
第七步:数字加入表达式中
操作符栈 *
后缀表达式 15 25 + 2
第八步:没有符号了,直接将操作符栈中剩余的依次加到表达式中,最终的结果 操作符栈 空
后缀表达式 15 25 + 2 *
这样就可以看出优先级对表达式的影响。
1. 操作数,操作符的提取
2. 括号等关系到运算符优先级的符号
3. 一元操作符(如 +(正), -(负)) 等
4. 操作符和操作数的匹配,括号的匹配,(函数参数的个数是否正确等)
基本思路如下:
用一个链表 List<ExpressionToken> 储存将要生成的后缀表达式
用一个栈 Stack<OperatorType> 储存操作符
判断当前节点, 如果是操作数, 直接加入后缀表达式中, 如果是操作符,则比较前一个操作符和当前操作符的优先级,
如果前一个操作符优先级较高,则将前一个操作符加入后缀表达式中,否则将操作符压入操作符栈,如果遇到反括号 ')', 则在操作符栈中反向搜索,直到遇到匹配的正括号为止,将中间的操作符依次加到后缀表达式中。
举例: 15+25*2, 共有 15, +, 25, *, 2 五个符号,下面一步步列出每一步操作
第一步: 数字加入后缀表达式
操作符栈 空
后缀表达式 15
第二步:+ 号 压入操作符栈
操作符栈 +
后缀表达式 15
第三步:
操作符栈 +
后缀表达式 15 25
第四步:是一个*号,因为*号的优先级比+号高,所以直接压入操作符栈中
操作符栈 + *
后缀表达式 15 25
第五步:
操作符栈 + *
后缀表达式 15 25 2
第六步:没有符号了,直接将操作符栈中剩余的依次加到表达式中,最终的结果
操作符栈 空
后缀表达式 15 25 2 * +
那假如括号呢?例如 (15 + 25) * 2, 共有7个符号,每一步的操作为
第一步: 左括号直接压入操作符栈
操作符栈 (
后缀表达式 空
第二步:数字加入表达式中
操作符栈 (
后缀表达式 15
第三步:+号压入操作符栈
操作符栈 ( +
后缀表达式 15
第四步:数字加入表达式中 操作符栈 ( +
后缀表达式 15 25
第五步:遇到反括号了,将两个括号之间操作符依次加入到表达式中,并删除匹配的正括号
操作符栈 空
后缀表达式 15 25 +
第六步:*号压入操作符栈
操作符栈 *
后缀表达式 15 25 +
第七步:数字加入表达式中
操作符栈 *
后缀表达式 15 25 + 2
第八步:没有符号了,直接将操作符栈中剩余的依次加到表达式中,最终的结果 操作符栈 空
后缀表达式 15 25 + 2 *
这样就可以看出优先级对表达式的影响。