C语言实现中缀后缀前缀表达式相互转化并求值Word格式.docx
《C语言实现中缀后缀前缀表达式相互转化并求值Word格式.docx》由会员分享,可在线阅读,更多相关《C语言实现中缀后缀前缀表达式相互转化并求值Word格式.docx(18页珍藏版)》请在冰豆网上搜索。
}Lnode;
typedefstructNode2//定义存储前缀表达式的结点类型
structNode2*next;
structNode2*prior;
}Lnode2;
3.运行、测试与分析
(1)按提示输入中缀表达式,如图1.1所示。
如输入中缀表达式不正确,提示输入有误,如图1.2,1.3所示。
图1.1
图1.2
图1.3
(2)选择表达式转换并求值方式。
按“1”选择中缀表达式求值,如图1.4所示。
图1.4
(3)按“2”选择中缀表达式转变为后缀表达式并求值,如图1.5所示。
图1.5
(4)按“3”选择中缀表达式转变为前缀表达式并求值,如图1.6所示。
图1.6
附录:
源代码
#include<
stdio.h>
stdlib.h>
#defineMAXNUM100
typedefintselemtype1;
//定义运算数栈的结点
typedefstruct//定义运算数栈的类型
{selemtype1*base;
selemtype1*top;
}sqstack1;
voidInitStack1(sqstack1&
s)//新建一个空运算数栈
{s.base=(selemtype1*)malloc(MAXNUM*sizeof(selemtype1));
s.top=s.base;
if(!
s.base)printf("
出错:
申请空间失败!
\n"
);
}
voidPush1(sqstack1&
s,selemtype1&
e)//运算数栈,入栈:
插入元素e为新的栈顶元素
{if(s.top-s.base>
=MAXNUM)
printf("
表达式过长!
1\n"
*s.top++=e;
}
voidGetTop1(sqstack1s,selemtype1&
e)//运算数栈,用e返回栈顶元素
{e=*(s.top-1);
voidPopopnd1(sqstack1&
e)//运算数栈,退栈:
删除栈顶元素,并用e返回其值
{e=*--s.top;
intstackempy1(sqstack1s)//运算数栈,若为空栈返回1,否则返回0
{if(s.top==s.base)return1;
elsereturn0;
typedefcharselemtype2;
//定义运算符栈的结点类型
typedefstruct//定义运算符栈类型
{selemtype2*base;
selemtype2*top;
}sqstack2;
voidInitStack2(sqstack2&
s)//新建一个空运算符栈
{s.base=(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;
char