用二叉树来表示表达式,树的每一个节点包括一个运算符和运算数。代数表达式中只包含+,-,*,/,(,)和一位整数且没有错误。按照先括号,再乘除,后加减的规则构造二叉树。如图所示是"1+(2+3)*2-4/5"代数表达式对应二叉树,用对应的二叉树计算表达式的值。
输入格式:
输入一行表达式字符串,以#结束,括号内只能有一个运算符。
输出格式:
输出表达式的计算结果.
#include<iostream>
#include<stack>
using namespace std;
typedef struct node
{char data;node* lchild, * rchild;
}*tree;
stack<tree> expt;
int judge(char ch)//判断是运算符
{if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')' || ch == '#')return 1;elsereturn 0;
}
int jisuan(int n1, int n2, char ch)//计算
{if (ch == '+')return n1 + n2;else if (ch == '-')return n1 - n2;else if (ch == '*')return n1 * n2;elsereturn n1 / n2;
}
char Precede(char ch1, char ch2)//判断优先级,ch1栈顶元素
{char flag = '>';if (ch1 == '+'){switch (ch2){case '+':case '-':case '#':case ')':flag = '>';break;case '*':case '/':case '(':flag = '<';break;}}else if (ch1 == '-'){switch (ch2){case '+':case '-':case '#':flag = '>';break;case '*':case '/':case '(':case ')':flag = '<';break;}}else if (ch1 == '*'){switch (ch2){case '+':case '-':case '#':case '*':case '/':case ')':flag = '>';break;case '(':flag = '<';break;}}else if (ch1 == '/'){switch (ch2){case '+':case '-':case '#':case '*':case '/':case ')':flag = '>';break;case '(':flag = '<';break;}}else if (ch1 == '('){switch (ch2){case '+':case '-':case '*':case '/':case '(':flag = '<';break;case ')':flag = '=';break;}}else if (ch1 == ')'){switch (ch2){case '+':case '-':case '*':case '/':case ')':case '#':flag = '>';break;}}else if (ch1 == '#'){switch (ch2){case '+':case '-':case '*':case '/':case '(':flag = '<';break;case '#':flag = '=';break;}}return flag;
}
void create(tree& t, tree a, tree b, char ch)//构建子树
{t = new node;t->data = ch;t->lchild = a, t->rchild = b;
}
void Createtree()
{char ch;stack<char> optr;//运算符optr.push('#');cin >> ch;//输入while (ch != '#' || optr.top() != '#'){if (!judge(ch))//不是运算符{tree t;t = new node;create(t, NULL, NULL, ch);//构建子树,操作数的左右子树为空expt.push(t);//压入子树栈cin >> ch;}else{switch (Precede(optr.top(), ch)){case '<'://ch的优先级高于栈顶运算符optr.push(ch);//ch压入运算符栈cin >> ch;break;case '>'://栈顶运算符优先级高于chchar yun;yun = optr.top();//取栈顶运算符optr.pop();tree a, b;a = new node, b = new node;b = expt.top();//右子树expt.pop();a = expt.top();//左子树expt.pop();tree t;t = new node;create(t, a, b, yun);//以栈顶运算符为根,构建子树expt.push(t);break;case '=':optr.pop();cin >> ch;break;}}}
}
int valuetree(tree t)//树计算
{int lchild = 0, rchild = 0;if (t->lchild == NULL && t->rchild == NULL)return t->data - '0';else{lchild = valuetree(t->lchild);rchild = valuetree(t->rchild);return jisuan(lchild, rchild, t->data);}
}
void printtree(tree t)//中序遍历
{if (t){printtree(t->lchild);cout << t->data;printtree(t->rchild);}
}
int main()
{Createtree();tree t = expt.top();//栈底即为树//printtree(t);int a = valuetree(t);cout << a;
}