1、Lnode; typedef struct Node2 /定义存储前缀表达式的结点类型 struct Node2 *next; struct Node2 *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附录:源代码#includest
2、dlib.h#define MAXNUM 100typedef int selemtype1; /定义运算数栈的结点typedef struct /定义运算数栈的类型selemtype1 *base; selemtype1 *top;sqstack1;void InitStack1(sqstack1 &s) /新建一个空运算数栈s.base=(selemtype1 *)malloc(MAXNUM*sizeof(selemtype1); s.top=s.base; if(!s.base) printf(出错:申请空间失败!n); void Push1(sqstack1 &s,selemtype1
3、 &e) /运算数栈,入栈:插入元素e为新的栈顶元素 if(s.top-s.base=MAXNUM) printf(表达式过长!1n *s.top+ =e;void GetTop1(sqstack1 s,selemtype1 &e) /运算数栈,用e返回栈顶元素e=*(s.top-1);void Popopnd1(sqstack1 &e) /运算数栈,退栈:删除栈顶元素,并用e返回其值e=*-s.top;int stackempy1(sqstack1 s) /运算数栈,若为空栈返回1,否则返回0if(s.top=s.base) return 1; else return 0;typedef c
4、har selemtype2; /定义运算符栈的结点类型typedef struct /定义运算符栈类型selemtype2 *base; selemtype2 *top;sqstack2;void InitStack2(sqstack2 &s) /新建一个空运算符栈s.base=(selemtype2 *)malloc(MAXNUM*sizeof(selemtype2);void Push2(sqstack2 &s,selemtype2 &e) /运算符栈,入栈:2nvoid GetTop2(sqstack2 s,selemtype2 &e) /运算符栈,用e返回栈顶元素void Popop
5、nd2(sqstack2 &e) /运算符栈,退栈:int stackempy2(sqstack2 s) /运算符栈,若为空栈返回1,否则返回0void priority(char c,int &i) /确定运算符优先级if (c=*|c=/%) i=2 ; else if (c=+-) i=1 ; else i=0;int compare(char a,char b) /比较栈顶元素运算符与外部运算符优先级大小,外部优先级大则返回1,反之返回0int in,out; priority(a,in); priority(b,out); if(outin) return 1;void Operat
6、(sqstack1 &OPND,sqstack2 &OPTR)int num1,num2,num; char c; 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);void Operatqianzhui(sqstack1 &void houzhuiqiuzhi(Lnode *p,int &e) /
7、后缀表达式求值sqstack1 OPND; /运算数栈 sqstack2 OPTR; /运算符栈 int n; p=p-next; InitStack1(OPND); InitStack2(OPTR); while(p) switch(p-data) case 1:n=p-data1; Push1(OPND,n); break; case 2:c=p-data2; Push2(OPTR,c); Operat(OPND,OPTR); default:printf(结点有误Popopnd1(OPND,n);e=n;void zhongzhui(Lnode *p) /中缀表达式求值 char c,c
8、2; 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(%cdata2);=%d ,n);void houzhui(Lnode *p) /中缀表达式转化为后缀表达式sqstack2 OPTR; Lnode *r,*q,*head; char
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1