代数表达式:1+2*3-4/5
#include <iostream>
#include<malloc.h>
#include<string.h>
using namespace std;
typedef struct node
{
char data;
struct node* lchild;
struct node* rchild;
}BTNode;
//构造代数表达式二叉树
BTNode* CTree(char s[],int i,int j)
{
BTNode *p;
int plus=0,posi;
if(i==j)
{
p=(BTNode*)malloc(sizeof(BTNode));
p->data=s[i];
p->lchild=NULL;
p->rchild=NULL;
return p;
}
//根据乘除后加减原则,将加减运算放到二叉树上层,这样会后遍历
for(int k=i;k<=j;k++)
if(s[k]=='-'||s[k]=='+')
{
plus++;
posi=k;
}
if(plus==0)
for(int k=i;k<=j;k++)
if(s[k]=='*'||s[k]=='/')
{
plus++;
posi=k;
}
if(plus!=0)
{
p=(BTNode *)malloc(sizeof(BTNode));
p->data=s[posi];
p->lchild=CTree(s,i,posi-1);
p->rchild=CTree(s,posi+1,j);
return p;
}
else
return NULL;
}
int Comp(BTNode *b)
{
int v1,v2;
if(b==NULL)
return 0;
if(b->lchild==NULL&&b->rchild==NULL)
return b->data-'0';
v1=Comp(b->lchild);
v2=Comp(b->rchild);
switch(b->data)
{
case '+':
return v1+v2;
case '-':
return v1-v2;
case '*':
return v1*v2;
case '/':
if(v2!=0)
return v1/v2;
else
abort();
}
return 0;
}
//输出构造好的二叉树
void DispNode(BTNode *b)
{
if(b!=NULL)
{
cout<<b->data;
if(b->lchild!=NULL||b->rchild!=NULL)
{
cout<<'(';
DispNode(b->lchild);
if(b->rchild!=NULL)
cout<<',';
DispNode(b->rchild);
cout<<')';
}
}
}
int main()
{
BTNode *b;
char s[10]="1+2*3-4/5";
b=CTree(s,0,strlen(s)-1);
DispNode(b);
cout<<endl;
cout<<Comp(b);
return 0;
}