ImageVerifierCode 换一换
格式:DOC , 页数:20 ,大小:1.84MB ,
资源ID:10580235      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-10580235.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C语言实现中缀、后缀、前缀表达式 相互转化并求值.doc)为本站会员(精品资料)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

C语言实现中缀、后缀、前缀表达式 相互转化并求值.doc

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;Lnode2;

3、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 /定义存储中缀表达式的

4、结点类型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;Lnode2; typedef int selemtype1; /定义运算数栈的结点typedef struct /定义运算数栈的类型selemtype1 *base;selemtype1 *top;sqstack1;void InitStack1(sqstack1 s.

5、top=s.base;if(!s.base) printf(“出错:申请空间失败!n“); void Push1(sqstack1 *s.top+ =e; void GetTop1(sqstack1 s,selemtype1 void Popopnd1(sqstack1 int stackempy1(sqstack1 s) /运算数栈,若为空栈返回 1,否则返回 0if(s.top=s.base) return 1;else return 0;typedef char selemtype2; /定义运算符栈的结点类型typedef struct /定义运算符栈类型selemtype2 *bas

6、e;selemtype2 *top;sqstack2;void InitStack2(sqstack2 s.top=s.base;if(!s.base) printf(“出错:申请空间失败!n“); void Push2(sqstack2 *s.top+ =e;void GetTop2(sqstack2 s,selemtype2 void Popopnd2(sqstack2 int stackempy2(sqstack2 s) /运算符栈,若为空栈返回 1,否则返回 0if(s.top=s.base) return 1;else return 0;void priority(char c,in

7、t else if (c=+|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;else return 0;void Operat(sqstack1 char c;Popopnd1(OPND,num2);Popopnd1(OPND,num1);Popopnd2(OPTR,c);switch(c)case +:num=num1+num2;break;cas

8、e -:num=num1-num2;break;case *:num=num1*num2;break;case /:num=num1/num2;break;case %:num=num1%num2;break;Push1(OPND,num); void Operatqianzhui(sqstack1 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*num2;b

9、reak;case /:num=num1/num2;break;case %:num=num1%num2;break;Push1(OPND,num); void houzhuiqiuzhi(Lnode *p,int /运算数栈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:c=p-data2;Push2(OPTR,c);Operat(OPND,OPTR);bre

10、ak;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)while(p)switch(p-data)case 1:n=p-data1;Push1(OPND,n);break;

11、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(compare(c2,c) Push2(OPTR,c);else Operat(OPND,OPTR);Push2(OPTR,c);break;break;defau

12、lt: 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 houzhui(Lnode *p) /中缀表达式转化为后缀表达式sqstack2 OPTR; /运算符栈Lnode *r,*q,*head;int n;char c,c2;I

13、nitStack2(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-data2;if(stackempy2(OPTR) Push2(OPTR,c);else switch(c) case (: Push2(OPTR,c);break;case ): Popopnd

14、2(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);r=(Lnode*)malloc(sizeof(struct Node); q-next=r;q=q-next;q-data=2;q-data2=c2;GetTop2(OPTR,c2); Push2(OPTR,c);br

15、eak; 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=NULL;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)

16、;printf(“=%d “,n);void qianzhuiqiuzhi(Lnode2 *p,int /运算数栈sqstack2 OPTR; /运算符栈int n;char c;Lnode2 *head;head=p;p=p-next;InitStack1(OPND);InitStack2(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(“结点有

17、误“);break;p=p-next;Popopnd1(OPND,n);e=n;void qianzhui(Lnode *p) /中缀表达式转化为前缀表达式sqstack2 OPTR; /运算符栈InitStack2(OPTR);int n;char c,c2;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);

18、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=(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

19、=n; break;case 2:c=q-data2;if(stackempy2(OPTR) Push2(OPTR,c);else GetTop2(OPTR,c2);if(c2=) Push2(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;def

20、ault: GetTop2(OPTR,c2);while(!compare(c2,c) Popopnd2(OPTR,c2);r=(Lnode2*)malloc(sizeof(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(

21、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 “,s-data1);if(s-data=2) printf(“%c“,s-data2);s=s-prior;qianzhuiqiuzhi(head2,n);printf(“=%d “,n);int main() char n10;char c;int i,j,k,a,b,z,y,e;Lnode *p,*q,*first;i=0;e=1;a

22、=0;b=1;z=0;y=0;p=(Lnode*)malloc(sizeof(struct Node);first=p;printf(“请输入中缀表达式“);do c = getchar();if(00p=p-next;for(k=0;kdata=1;p-data1=a;i=0;a=0; if(c!=n) if(p-data=2) if(p-data2!=) q=(Lnode*)malloc(sizeof(struct Node);p-next=q;p=p-next;p-data=2;p-data2=c;if(c=() z+;if(c=) y+; default:if(c!=+while (c != n);if(z!=y) b=0;p-next=NULL;if(b=0)printf(“输入中缀表达式有误“);elseprintf(“输入 1 中缀表达式求值,输入 2 后缀表达式求值,输入 3 前缀表达式求值“);scanf(“%d“,if(b=1) zhongzhui(first);if(b=2) houzhui(first);if(b=3) qianzhui(first);return 1;

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报