二叉树表达式求值.docx
《二叉树表达式求值.docx》由会员分享,可在线阅读,更多相关《二叉树表达式求值.docx(6页珍藏版)》请在冰豆网上搜索。
二叉树表达式求值
二叉树表达式求值
本文由邓志光8贡献
//二叉树上的表达式求值算法
#include
#include
#include
#definemax100
typedefstruct
{
char*data;
inttop;
intstacksize;
}seqstack1;
typedefstructTree
{
chardata1[max];
floatdata2;
structTree*lchild,*rchild;
}*BiTree,Bnode;
typedefstruct
{
BiTree*data;
inttop;
intstacksize;
}seqstack2;
//运算符栈
intinitstack1(seqstack1&L)
{
L.data=(char*)malloc(max*sizeof(char));
if(L.data==NULL)exit(0);
L.top=-1;
L.stacksize=max;
return1;
}
intpushstack1(seqstack1&L,charch)
{
if(L.top==L.stacksize-1)
{
printf("栈满!
\n");return0;
}
L.top++;
L.data[L.top]=ch;
return1;
}
charpopstack1(seqstack1&L)
{
if(L.top==-1)
printf("@空栈!
\n");
else
returnL.data[L.top--];
}
chargettop1(seqstack1L)
{
if(L.top==-1)
printf("!
!
空栈!
\n");
else
returnL.data[L.top];
}
//操作数栈
intinitstack2(seqstack2&L)
{
L.data=(BiTree*)malloc(max*sizeof(BiTree));
if(L.data==NULL)exit(0);
L.top=-1;
L.stacksize=max;
return1;
}
intpushstack2(seqstack2&L,BiTreeT)
{
if(L.top==L.stacksize-1)
{
printf("栈满!
\n");return0;
}
L.top++;
L.data[L.top]=T;
return1;
}
intpopstack2(seqstack2&L,BiTree&T)
{
if(L.top==-1)
{printf("?
空栈!
\n");return0;}
T=L.data[L.top];
L.top--;
return1;
}
intgettop2(seqstack2L,BiTree&T)
{
if(L.top==-1)
{printf("空栈!
\n");return0;}
T=L.data[L.top];
return1;
}
//求值栈
intprior(charstr1,charstr2)
{
switch(str1)
{
case'#':
case'(':
case'[':
return0;break;
case'*':
case'/':
return1;break;
case'+':
case'-':
switch(str2)
{
case'+':
case'-':
case'#':
return1;break;
case'*':
case'/':
return0;break;
}break;
}
}
intindigit(charch)
{
if(ch>='0'&&ch<='9'||ch=='.')
return1;
else
return0;
}
floatcalculate(floata,floatb,char*ch)
{
if(strcmp(ch,"*")==0)
return(a*b);
elseif(strcmp(ch,"/")==0)
return(a/b);
elseif(strcmp(ch,"+")==0)
return(a+b);
else
return(a-b);
}
floattransform(char*ch)
{
floatresult=0,result1=0,result2=0;
charstr[20];
inti=0,k=0;
while(ch[i]>='0'&&ch[i]<='9')
{
result1=result1*10+ch[i]-'0';
i++;
}
if(ch[i]=='\0')
returnresult1;
else
{
while(ch[i]!
='\0')
{
str[k]=ch[i];
k++;i++;
}
str[k]='\0';
k--;
while(str[k]!
='.')
{
result2=result2*0.1+str[k]-'0';
k--;
}
result2=result2*0.1;
result=result1+result2;
returnresult;
}
}
//建子叶
voidcreateleaf(BiTree&T,char*ch,seqstack2&L2)
{
floatn;
T=(Bnode*)malloc(sizeof(Bnode));
if(T==NULL)exit(0);
n=transform(ch);
strcpy(T->data1,ch);
T->data2=n;
T->lchild=T->rchild=NULL;
pushstack2(L2,T);
}
//建子树
voidcreatetree(BiTree&T,char*ch,BiTreerchild,BiTreelchild,seqstack2&L2)
{
floatn;
ch[1]='\0';
T=(Bnode*)malloc(sizeof(Bnode));
if(T==NULL)exit(0);
popstack2(L2,rchild);
popstack2(L2,lchild);
n=calculate(lchild->data2,rchild->data2,ch);
T->data2=n;strcpy(T->data1,ch);
T->rchild=rchild;T->lchild=lchild;
pushstack2(L2,T);
}
//表达式转换为二叉树存储
BiTreeTobitree(char*p)
{
seqstack1L1;seqstack2L2;
inti=0,j=0;
BiTreeT,lchild,rchild;
charstr[20],ch;
initstack1(L1);pushstack1(L1,'#');initstack2(L2);
while(p[i]!
='\0')
{
if(indigit(p[i]))
{
while(indigit(p[i]))
{
str[j++]=p[i];
i++;
}
str[j]='\0';
createleaf(T,str,L2);
j=0;i--;
}
else
{
switch(p[i])
{
case'(':
case'[':
pushstack1(L1,p[i]);break;
case')':
ch=popstack1(L1);
while(ch!
='(')
{
createtree(T,&ch,rchild,lchild,L2);
ch=popstack1(L1);
}
break;
case']':
ch=popstack1(L1);
while(ch!
='[')
{
createtree(T,&ch,rchild,lchild,L2);
ch=popstack1(L1);
}
break;
default:
ch=gettop1(L1);
while(prior(ch,p[i]))
{
createtree(T,&ch,rchild,lchild,L2);
ch=popstack1(L1);ch=gettop1(L1);
}
pushstack1(L1,p[i]);
break;
}
}
i++;
}
popstack2(L2,T);
returnT;
}
//后序遍历表达式树
voidpostorder(BiTreeT)
{
if(T)
{
postorder(T->lchild);
postorder(T->rchild);
printf("%s",T->data1);
}
}
//先序遍历表达式树
voidmidorder(BiTreeT)
{
if(T)
{
midorder(T->lchild);
printf("%s",T->data1);
midorder(T->rchild);
}
}
voidmain()
{
char*p;
BiTreeT;
p=(char*)malloc(max*sizeof(char));
printf("输入表达式(以#号结束):
");
scanf("%s",p);
T=Tobitree(p);
printf("后缀式为:
");
postorder(T);
printf("\n");
printf("前缀式为");
midorder(T);
printf("\n");
printf("结果为:
");
printf("%.3f\n",T->data2);
}