C语言实现中缀后缀前缀表达式 相互转化并求值_第1页
C语言实现中缀后缀前缀表达式 相互转化并求值_第2页
C语言实现中缀后缀前缀表达式 相互转化并求值_第3页
C语言实现中缀后缀前缀表达式 相互转化并求值_第4页
C语言实现中缀后缀前缀表达式 相互转化并求值_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1.问题描述(1)表达式求值问题 表达式是数据运算的基本形式。人们的书写习惯是中缀式,如:11+22*(7-4)/3。中缀式的计算按运算符的优先级及括号优先的原则,相同级别从左到右进行计算。表达式还有后缀式(如:22 7 4 - * 3 / 11 +)和前缀式(如:+ 11 / * 22 7 4 3)。后缀表达式和前缀表达式中没有括号,给计算带来方便。如后缀式计算时按运算符出现的先后进行计算。本设计的主要任务是进行表达式形式的转换及不同形式的表达式计算。2. 数据结构设计(1)表达式求值问题 由于表达式中有字符与数字两种类型,故定义结点一个标志域data,标志结点存储的为字符data=2还是数

2、字data=1,再寻找结点中对应的存储位置,读取数字域data1,字符域data2。而在前缀表达式时,存在表达式逆序,因表达式类型不统一,用栈逆序极不方便,选择构建双向链表,存储表达式。typedef struct Node /定义存储中缀表达式的结点类型int data; int data1; char data2; struct Node *next;Lnode; typedef struct Node2 /定义存储前缀表达式的结点类型int data; int data1; char data2; struct Node2 *next; struct Node2 *prior;Lnode

3、2; 3. 运行、测试与分析(1)表达式求值问题(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附录:源代码(1)表达式求值问题#include #include#define MAXNUM 100typedef struct Node /定义存储中缀表达式的结点类型int d

4、ata; int data1; char data2; struct Node *next;Lnode; typedef struct Node2 /定义存储前缀表达式的结点类型int data; int data1; char data2; struct Node2 *next; struct Node2 *prior;Lnode2; typedef int selemtype1; /定义运算数栈的结点typedef struct /定义运算数栈的类型selemtype1 *base; selemtype1 *top;sqstack1;void InitStack1(sqstack1 &s)

5、 /新建一个空运算数栈s.base=(selemtype1 *)malloc(MAXNUM*sizeof(selemtype1); s.top=s.base; if(!s.base) printf(出错:申请空间失败!n); void Push1(sqstack1 &s,selemtype1 &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

6、 Popopnd1(sqstack1 &s,selemtype1 &e) /运算数栈,退栈:删除栈顶元素,并用e返回其值e=*-s.top;int stackempy1(sqstack1 s) /运算数栈,若为空栈返回1,否则返回0if(s.top=s.base) return 1; else return 0;typedef char selemtype2; /定义运算符栈的结点类型typedef struct /定义运算符栈类型selemtype2 *base; selemtype2 *top;sqstack2;void InitStack2(sqstack2 &s) /新建一个空运算符栈

7、s.base=(selemtype2 *)malloc(MAXNUM*sizeof(selemtype2); s.top=s.base; if(!s.base) printf(出错:申请空间失败!n); void Push2(sqstack2 &s,selemtype2 &e) /运算符栈,入栈:插入元素e为新的栈顶元素 if(s.top-s.base=MAXNUM) printf(出错:表达式过长!2n); *s.top+ =e;void GetTop2(sqstack2 s,selemtype2 &e) /运算符栈,用e返回栈顶元素e=*(s.top-1);void Popopnd2(sq

8、stack2 &s,selemtype2 &e) /运算符栈,退栈:删除栈顶元素,并用e返回其值e=*-s.top;int stackempy2(sqstack2 s) /运算符栈,若为空栈返回1,否则返回0if(s.top=s.base) return 1; else return 0;void priority(char c,int &i) /确定运算符优先级if (c=*|c=/|c=%) i=2 ; else if (c=+|c=-) i=1 ; else i=0;int compare(char a,char b) /比较栈顶元素运算符与外部运算符优先级大小,外部优先级大则返回1,反

9、之返回0int in,out; priority(a,in); priority(b,out); if(outin) return 1; else return 0;void Operat(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;break; case *:num=num1*num2;b

10、reak; case /:num=num1/num2;break; case %:num=num1%num2;break; Push1(OPND,num); void Operatqianzhui(sqstack1 &OPND,sqstack2 &OPTR)int num1,num2,num; char c; Popopnd1(OPND,num1); Popopnd1(OPND,num2); Popopnd2(OPTR,c); switch(c) case +:num=num1+num2;break; case -:num=num1-num2;break; case *:num=num1*nu

11、m2;break; case /:num=num1/num2;break; case %:num=num1%num2;break; Push1(OPND,num); void houzhuiqiuzhi(Lnode *p,int &e) /后缀表达式求值sqstack1 OPND; /运算数栈 sqstack2 OPTR; /运算符栈 int n; char c; p=p-next; InitStack1(OPND); InitStack2(OPTR); while(p) switch(p-data) case 1:n=p-data1; Push1(OPND,n); break; case 2

12、:c=p-data2; Push2(OPTR,c); Operat(OPND,OPTR); break; default:printf(结点有误); break; p=p-next; Popopnd1(OPND,n);e=n;void zhongzhui(Lnode *p) /中缀表达式求值sqstack1 OPND; /运算数栈 sqstack2 OPTR; /运算符栈 int n; char c,c2; Lnode *first; first=p; p=p-next; InitStack1(OPND); InitStack2(OPTR); while(!stackempy2(OPTR)|p

13、) while(p) switch(p-data) case 1:n=p-data1; Push1(OPND,n); break; case 2:c=p-data2; if(stackempy2(OPTR) Push2(OPTR,c); else switch(c) case (: Push2(OPTR,c);break; case ): GetTop2(OPTR,c2); while(c2!=() Operat(OPND,OPTR); GetTop2(OPTR,c2); Popopnd2(OPTR,c2); break; default: GetTop2(OPTR,c2); if(compa

14、re(c2,c) Push2(OPTR,c); else Operat(OPND,OPTR); Push2(OPTR,c); break; break; default: printf(结点有误); break; p=p-next; while(!stackempy2(OPTR) Operat(OPND,OPTR); Popopnd1(OPND,n); p=first-next; while(p) if(p-data=1) printf(%d ,p-data1); if(p-data=2) printf(%c,p-data2); p=p-next; printf(=%d ,n);void ho

15、uzhui(Lnode *p) /中缀表达式转化为后缀表达式sqstack2 OPTR; /运算符栈 Lnode *r,*q,*head; int n; char c,c2; InitStack2(OPTR); p=p-next; q=(Lnode*)malloc(sizeof(struct Node); head=q; while(p) switch(p-data) case 1:n=p-data1; r=(Lnode*)malloc(sizeof(struct Node); q-next=r; q=q-next; q-data=1; q-data1=n; break; case 2:c=p

16、-data2; if(stackempy2(OPTR) Push2(OPTR,c); else switch(c) case (: Push2(OPTR,c);break; case ): Popopnd2(OPTR,c2); while(c2!=() r=(Lnode*)malloc(sizeof(struct Node); q-next=r; q=q-next; q-data=2; q-data2=c2; Popopnd2(OPTR,c2); break; default: GetTop2(OPTR,c2); while(!compare(c2,c) Popopnd2(OPTR,c2);

17、r=(Lnode*)malloc(sizeof(struct Node); q-next=r; q=q-next; q-data=2; q-data2=c2; GetTop2(OPTR,c2); Push2(OPTR,c); break; break; default: printf(结点有误); break; p=p-next; while(!stackempy2(OPTR) Popopnd2(OPTR,c2); r=(Lnode*)malloc(sizeof(struct Node); q-next=r; q=q-next; q-data=2; q-data2=c2; q-next=NUL

18、L; q=head-next; while(q) if(q-data=1) printf(%d ,q-data1); if(q-data=2) printf(%c,q-data2); q=q-next; houzhuiqiuzhi(head,n); printf(=%d ,n);void qianzhuiqiuzhi(Lnode2 *p,int &e) /前缀表达式求值sqstack1 OPND; /运算数栈 sqstack2 OPTR; /运算符栈 int n; char c; Lnode2 *head; head=p; p=p-next; InitStack1(OPND); InitSta

19、ck2(OPTR); while(p!=head) switch(p-data) case 1:n=p-data1; Push1(OPND,n); break; case 2:c=p-data2; Push2(OPTR,c); Operatqianzhui(OPND,OPTR); break; default:printf(结点有误); break; p=p-next; Popopnd1(OPND,n);e=n;void qianzhui(Lnode *p) /中缀表达式转化为前缀表达式sqstack2 OPTR; /运算符栈 InitStack2(OPTR); int n; char c,c

20、2; Lnode *first; Lnode2 *q,*head,*r,*head2,*s; first=p; p=p-next; q=(Lnode2*)malloc(sizeof(struct Node2); /建立存中缀表达式的双向循环链表 head=q; while(p) r=(Lnode2*)malloc(sizeof(struct Node2); q-next=r; r-prior=q; q=q-next; q-data=p-data; q-data1=p-data1; q-data2=p-data2; p=p-next; q-next=head; head-prior=q; s=(

21、Lnode2*)malloc(sizeof(struct Node2); /建立存前缀表达式的双向循环链表 head2=s; while(q!=head) switch(q-data) case 1:n=q-data1; r=(Lnode2*)malloc(sizeof(struct Node2); s-next=r; r-prior=s; s=s-next; s-data=1; s-data1=n; break; case 2:c=q-data2; if(stackempy2(OPTR) Push2(OPTR,c); else GetTop2(OPTR,c2); if(c2=) Push2(

22、OPTR,c); else switch(c) case ):Push2(OPTR,c);break; case (: Popopnd2(OPTR,c2); while(c2!=) r=(Lnode2*)malloc(sizeof(struct Node2); s-next=r; r-prior=s; s=s-next; s-data=2; s-data2=c2; Popopnd2(OPTR,c2); break; default: GetTop2(OPTR,c2); while(!compare(c2,c) Popopnd2(OPTR,c2); r=(Lnode2*)malloc(sizeo

23、f(struct Node2); s-next=r; r-prior=s; s=s-next; s-data=2; s-data2=c2; GetTop2(OPTR,c2); Push2(OPTR,c); break; break; default:printf(结点有误); break; q=q-prior; while(!stackempy2(OPTR) Popopnd2(OPTR,c2); r=(Lnode2*)malloc(sizeof(struct Node2); s-next=r; r-prior=s; s=s-next; s-data=2; s-data2=c2; s-next=head2; head2-prior=s; while(s!=head2) if(s-data=1) printf(%d

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论