二叉树表达式求值.docx

上传人:b****3 文档编号:5445598 上传时间:2022-12-16 格式:DOCX 页数:6 大小:15.27KB
下载 相关 举报
二叉树表达式求值.docx_第1页
第1页 / 共6页
二叉树表达式求值.docx_第2页
第2页 / 共6页
二叉树表达式求值.docx_第3页
第3页 / 共6页
二叉树表达式求值.docx_第4页
第4页 / 共6页
二叉树表达式求值.docx_第5页
第5页 / 共6页
点击查看更多>>
下载资源
资源描述

二叉树表达式求值.docx

《二叉树表达式求值.docx》由会员分享,可在线阅读,更多相关《二叉树表达式求值.docx(6页珍藏版)》请在冰豆网上搜索。

二叉树表达式求值.docx

二叉树表达式求值

二叉树表达式求值

本文由邓志光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);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1