#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX_LEN 5
typedef struct node // 结点类型定义
{
char optr;
int data;
struct node *lchild;
struct node *rchild;
}BTNode;
BTNode *getNode(char *str,int &pos)
{
BTNode *createTree(char *str,int &pos);
BTNode *p = new BTNode;
char ch = str[0];
if(isdigit(ch))
{
int i = 0;
char data[MAX_LEN];
while(isdigit(ch=str[i]))
data[i++] = ch;
p->data = atoi(data);
pos += i;
}
else if(ch =='+' || ch =='-' || ch =='*' || ch =='/')
{
p->optr = ch;
pos += 1;
}
else if(ch =='(')
{
pos += 1;
p = createTree(str+1,pos);
}
else if(ch ==')')
{
pos += 1;
return NULL;
}
else if(ch=='\0')
return NULL;
return p;
}
int getPriority(char optr)
{
switch(optr)
{
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
}
return 0;
}
BTNode *createTree(char *str,int &pos)
{
int pos1 = 0;
BTNode *lchild = getNode(str+pos1,pos1);
BTNode *root = getNode(str+pos1,pos1);
BTNode *rchild = getNode(str+pos1,pos1);
root->lchild = lchild;
root->rchild = rchild;
BTNode *node;
while((node=getNode(str+pos1,pos1)))
{
if(getPriority(root->optr) > getPriority(node->optr))
{
node->lchild=root;
node->rchild=getNode(str+pos1,pos1);
root = node;
}
else
{
node->lchild=root->rchild;
root->rchild=node;
node->rchild=getNode(str+pos1,pos1);
}
}
pos += pos1;
return root;
}
int result(BTNode *b) //计算表达式
{
int n1,n2;
switch(b->optr)
{
case'+':
n1=result(b->lchild);//计算左子表达式
n2=result(b->rchild);//计算右子表达式
b->data=n1+n2;break;
case'-':
n1=result(b->lchild);//计算左子表达式
n2=result(b->rchild);//计算右子表达式
b->data=n1-n2;break;
case'*':
n1=result(b->lchild);//计算左子表达式
n2=result(b->rchild);//计算右子表达式
b->data=n1*n2;break;
case'/':
n1=result(b->lchild);//计算左子表达式
n2=result(b->rchild);//计算右子表达式
b->data=n1/n2;break;
default:
return b->data;
}
return b->data;
}
void main()
{
BTNode *b=NULL,*q=NULL;
char str[100]; //="(20+30+5)*3";
printf("请输入符合要求的代数表达式:");
scanf("%s",str);
int n=0,i=0;
while(str[i++] != '\0')
n++;
int pos = 0;
b = createTree(str,pos);
// b = create(str,n);
printf("该表达式的值为:%d\n",result(b));
int a;
scanf("%d",&a);
}