有时候,灵感+努力+伙伴的箴言就是成功。
这是我们的数据结构作业,因为之前用双栈实现过(双栈实现计算器),再写起来就轻松多了。二叉树实现表达式求值实际上是一个后序遍历二叉树的过程,根据规则左右根,找到左结点,右结点,和根节点,进行运算就可以了,好了下面就直接上代码了。
注:此程序能够实现10以内的加减乘除(结果无所谓),记得要以#结尾哦。
#include<stdio.h>
#include<iostream>
#include<cctype>
#include<stack>
#include<stdlib.h>
using namespace std;
//定义树节点
struct TNode
{
char cha;
struct TNode *lchild,*rchild;
};
//定义树根 最顶树根
TNode * Tree;
char compare(char a, char b)
{
int i, j;
char pre[7][7] =
{ //定义运算符之间的优先级
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','0'},
{'>','>','>','>','0','>','>'},
{'<','<','<','<','<','0','='},
};
switch(a)
{
case '+':
i = 0;
break;
case '-':
i = 1;
break;
case '*':
i = 2;
break;
case '/':
i = 3;
break;
case '(':
i = 4;
break;
case ')':
i = 5;
break;
case '#':
i = 6;
break;
}
switch(b)
{
case '+':
j = 0;
break;
case '-':
j = 1;
break;
case '*':
j = 2;
break;
case '/':
j = 3;
break;
case '(':
j = 4;
break;
case ')':
j = 5;
break;
case '#':
j = 6;
break;
default:
printf("表达式要以#结尾!!!\n");
exit(1);
}
return pre[i][j];
}
//创建树节点
TNode * CreatNode(TNode *T,TNode *l,TNode *r,char ch)
{
T->cha = ch;
T->lchild = l;
T->rchild = r;
return T;
}
//读入表达式
void init_EXPT()
{
stack<TNode *> EXPT;
stack<char> OPTR;
OPTR.push('#');
char ch;
cin>>ch;
while(ch!='#'||OPTR.top()!='#')
{
if(isdigit(ch))
{
TNode *T ;
T = (TNode *)malloc(sizeof(TNode));
Tree = CreatNode(T,NULL,NULL,ch);
EXPT.push(Tree);
cin>>ch;
}
if(!isdigit(ch))
{
if(OPTR.empty())
OPTR.push(ch);
else
{
char top;
top = OPTR.top();
switch(compare(top,ch))
{
case '<':
{
OPTR.push(ch);
cin>>ch;
break;
}
case '>':
{
TNode * T ,*a,*b;
T = (TNode *)malloc(sizeof(TNode));
char theta = OPTR.top();OPTR.pop();
b = EXPT.top();EXPT.pop();
a = EXPT.top();EXPT.pop();
Tree = CreatNode(T,a,b,theta);
EXPT.push(Tree);
break;
}
case '=':
{
OPTR.pop();
cin>>ch;
break;
}
}
}
}
}
}
//计算表达式
float getvalue(char optr,float a,float b)
{
float result ;
switch(optr)
{
case '+':
{
result = (float)a+(float)b;
break;
}
case '-':
{
result = (float)a-(float)b;
break;
}
case '*':
{
result = (float)a*(float)b;
break;
}
case '/':
{
result = (float)a/(float)b;
break;
}
}
return result;
}
float calculate(TNode *T)
{
float lvalue,rvalue;
lvalue = rvalue = 0;
if(T->lchild==NULL&&T->rchild==NULL)
return T->cha - '0';
else
{
lvalue = (float)calculate(T->lchild);
rvalue = (float)calculate(T->rchild);
return getvalue(T->cha,lvalue,rvalue);
}
}
int main()
{
float result;
cout<<"请输入表达式并以'#'结尾(例如:7/(5+2)#):"<<endl;
init_EXPT();
result = calculate(Tree);
cout<<result<<endl;
return 0;
}