要求
输入一个中缀表达式,构造表达式树,以文本方式输出树结构。
输入:例如,输入a+b+c*(d+e)
输出:以缩进表示二叉树的层次,左(根),右(叶),上(右子树),下(左子树)
分析
我们有两个核心的问题需要解决,一是如何按照中缀表达式来构建二叉树,二是如何用这种形式进行输出。
放码过来
postfix.h
我们知道由后缀表达式生成二叉树很简单,所以我们需要做的第一步就是讲中缀表达式转换为后缀表达式。
中缀表达式转后缀表达式的方法:
1.遇到操作数:直接输出(添加到后缀表达式中)
2.栈为空时,遇到运算符,直接入栈
3.遇到左括号:将其入栈
4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。
5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈
6.最终将栈中的元素依次出栈,输出。
string postfix(string exp)
{
char token; //当前读取的字符
string s;
Stack<char>opStack;
string postfixExp; //目标后缀表达式
for(int i=0;i<exp.length();i++)
{
token=(char)exp[i];
switch(token)
{
case '(':
opStack.push(token); //是 ( 则放入栈中
break;
case ')':
while(opStack.top()!='(')