中缀表达式——表达式树
还记得之前讲过的波兰表达式和逆波兰表达式么?我再最后提了一句可以将中缀表达式像以下的方法解析成一个树:
波兰和逆波兰表达式分别是对上面得树进行前序和后序遍历。我们这里的表达式树,就是这个树。我们现在需要学习如何将中缀表达式转化为上面这个树。
代码实现
事实上我们可以简单的总结几个小结论:
1.叶节点一定是数字
2.没有括号的情况下,相对运算优先级低的运算符放在树的上层位置
根据上面的两个结论,我们对建树就有一个粗略的概念了,用l和r分别表示两个端点[l,r),如果r-l=1,代表表达式由一个结点组成,如果表达式合法,那么剩下的一定是一个数字,于是构造成叶节点。
对于一长段的表达式,我们需要遍历一遍找到合适的运算符作为根节点。但现在的问题如何处理括号改变运算优先级的情况。
事实上我们再深入观察一下可以发现,如果一个表达式括号外有运算符,那么括号外的运算符的优先级一定可以视为低于括号内的运算符。也就是说作为根节点的运算符,一定要在括号之外。
如果不存在这样的结点呢?说明整个表达式都在括号之内,脱去外层的括号即可。代码如下:
const int maxn=1000;//nc表示当前树里面的结点总数,lch[i]和rch[i]表示编号为i的结点左右子节点的编号
int lch[maxn],rch[maxn],nc=0; char op[maxn];//op[i]表示编号为i的结点存储的字符 <