c语言实现中缀后缀前缀表达式相互转化并求值Word下载.docx
- 文档编号:18871408
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:18
- 大小:232.45KB
c语言实现中缀后缀前缀表达式相互转化并求值Word下载.docx
《c语言实现中缀后缀前缀表达式相互转化并求值Word下载.docx》由会员分享,可在线阅读,更多相关《c语言实现中缀后缀前缀表达式相互转化并求值Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
(4)按“3”选择中缀表达式转变为前缀表达式并求值,如图所示。
附录:
源代码
#include<
>
#defineMAXNUM100
typedefintselemtype1;
//定义运算数栈的结点
typedefstruct//定义运算数栈的类型
{selemtype1*base;
selemtype1*top;
}sqstack1;
voidInitStack1(sqstack1&
s)//新建一个空运算数栈
{=(selemtype1*)malloc(MAXNUM*sizeof(selemtype1));
=;
if(!
printf("
出错:
申请空间失败!
\n"
);
}
voidPush1(sqstack1&
s,selemtype1&
e)//运算数栈,入栈:
插入元素e为新的栈顶元素
{ifprintf("
表达式过长!
1\n"
*++=e;
}
voidGetTop1(sqstack1s,selemtype1&
e)//运算数栈,用e返回栈顶元素
{e=*;
voidPopopnd1(sqstack1&
e)//运算数栈,退栈:
删除栈顶元素,并用e返回其值
intstackempy1(sqstack1s)//运算数栈,若为空栈返回1,否则返回0
{if==return1;
elsereturn0;
typedefcharselemtype2;
//定义运算符栈的结点类型
typedefstruct//定义运算符栈类型
{selemtype2*base;
selemtype2*top;
}sqstack2;
voidInitStack2(sqstack2&
s)//新建一个空运算符栈
{=(selemtype2*)malloc(MAXNUM*sizeof(selemtype2));
voidPush2(sqstack2&
s,selemtype2&
e)//运算符栈,入栈:
2\n"
voidGetTop2(sqstack2s,selemtype2&
e)//运算符栈,用e返回栈顶元素
voidPopopnd2(sqstack2&
e)//运算符栈,退栈:
intstackempy2(sqstack2s)//运算符栈,若为空栈返回1,否则返回0
voidpriority(charc,int&
i)//确定运算符优先级
{if(c=='
*'
||c=='
/'
%'
)i=2;
elseif(c=='
+'
-'
)i=1;
elsei=0;
intcompare(chara,charb)//比较栈顶元素运算符与外部运算符优先级大小,外部优先级大则返回1,反之返回0
{intin,out;
priority(a,in);
priority(b,out);
if(out>
in)return1;
voidOperat(sqstack1&
OPND,sqstack2&
OPTR)
{intnum1,num2,num;
charc;
Popopnd1(OPND,num2);
Popopnd1(OPND,num1);
Popopnd2(OPTR,c);
switch(c)
{case'
:
num=num1+num2;
break;
case'
num=num1-num2;
num=num1*num2;
num=num1/num2;
num=num1%num2;
}
Push1(OPND,num);
voidOperatqianzhui(sqstack1&
voidhouzhuiqiuzhi(Lnode*p,int&
e)//后缀表达式求值
{sqstack1OPND;
//运算数栈
sqstack2OPTR;
//运算符栈
intn;
p=p->
next;
InitStack1(OPND);
InitStack2(OPTR);
while(p)
{switch(p->
data)
{case1:
n=p->
data1;
Push1(OPND,n);
break;
case2:
c=p->
data2;
Push2(OPTR,c);
Operat(OPND,OPTR);
default:
printf("
结点有误"
Popopnd1(OPND,n);
e=n;
voidzhongzhui(Lnode*p)//中缀表达式求值
charc,c2;
Lnode*first;
first=p;
while(!
stackempy2(OPTR)||p)
{while(p)
if(stackempy2(OPTR))Push2(OPTR,c);
else{switch(c)
('
Push2(OPTR,c);
)'
GetTop2(OPTR,c2);
while(c2!
='
)
{Operat(OPND,OPTR);
Popopnd2(OPTR,c2);
if(compare(c2,c))Push2(OPTR,c);
else{Operat(OPND,OPTR);
stackempy2(OPTR))
Operat(OPND,OPTR);
Popopnd1(OPND,n);
p=first->
{if(p->
data==1)printf("
%d"
p->
data1);
if(p->
data==2)printf("
%c"
data2);
=%d"
n);
voidhouzhui(Lnode*p)//中缀表达式转化为后缀表达式
{sqstack2OPTR;
Lnode*r,*q,*head;
q=(Lnode*)malloc(sizeof(structNode));
head=q;
{switch(p->
r=(Lnode*)malloc(sizeof(structNode));
q->
next=r;
q=q->
data=1;
data1=n;
{case'
{r=(Lnode*)malloc(sizeof(structNode));
data=2;
data2=c2;
compare(c2,c))
{Popopnd2(OPTR,c2);
}
break;
next=NULL;
q=head->
while(q)
{if(q->
q->
if(q->
houzhuiqiuzhi(head,n);
voidqianzhuiqiuzhi(Lnode2*p,int&
e)//前缀表达式求值
Lnode2*head;
head=p;
while(p!
=head)
Operatqianzhui(OPND,OPTR);
voidqianzhui(Lnode*p)//中缀表达式转化为前缀表达式
Lnode2*q,*head,*r,*head2,*s;
q=(Lnode2*)malloc(sizeof(structNode2));
//建立存中缀表达式的双向循环链表
{r=(Lnode2*)malloc(sizeof(structNode2));
r->
prior=q;
data=p->
data;
data1=p->
data2=p->
next=head;
head->
s=(Lnode2*)malloc(sizeof(structNode2));
//建立存前缀表达式的双向循环链表
head2=s;
while(q!
{switch(q->
n=q->
r=(Lnode2*)malloc(sizeof(structNode2));
s->
prior=s;
s=s->
c=q->
else
{GetTop2(OPTR,c2);
if(c2=='
)Push2(OPTR,c);
else{switch(c)
{case'
Push2(OPTR,c);
{r=(Lnode2*)malloc(sizeof(structNode2));
prior;
next=head2;
head2->
while(s!
=head2)
{if(s->
s->
if(s->
qianzhuiqiuzhi(head2,n);
intmain()
{charn[10];
inti,j,k,a,b,z,y,e;
Lnode*p,*q,*first;
i=0;
e=1;
a=0;
b=1;
z=0;
y=0;
p=(Lnode*)malloc(sizeof(structNode));
请输入中缀表达式"
do
{c=getchar();
if('
0'
<
=c&
&
c<
9'
{n[i]=c;
i++;
{switch(c)
\n'
{if(n[0]>
'
n[0]<
{q=(Lnode*)malloc(sizeof(structNode));
p->
next=q;
for(k=0;
k<
i;
k++)
{for(j=0;
j<
=i-k-2;
j++)
e=e*10;
a=a+(n[k]-'
)*e;
e=1;
n[k]='
;
}
data1=a;
i=0;
if(c!
{if(p->
data==2)
data2!
c!
b=0;
data2=c;
if(c=='
)z++;
)y++;
}while(c!
='
if(z!
=y)b=0;
p->
if(b==0)
输入中缀表达式有误"
else
{printf("
输入1中缀表达式求值,输入2后缀表达式求值,输入3前缀表达式求值"
scanf("
%d"
&
b);
if(b==1)zhongzhui(first);
if(b==2)houzhui(first);
if(b==3)qianzhui(first);
return1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 实现 中缀 后缀 前缀 表达式 相互 转化 求值