分享
分销 收藏 举报 申诉 / 20
播放页_导航下方通栏广告

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

  • 上传人:二***
  • 文档编号:4498024
  • 上传时间:2024-09-25
  • 格式:DOC
  • 页数:20
  • 大小:273KB
  • 下载积分:5 金币
  • 播放页_非在线预览资源立即下载上方广告
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    语言 实现 中缀 后缀 前缀 表达式 相互 转化 求值
    资源描述:
    . . . . 1.问题描述 (1)表达式求值问题 表达式是数据运算的基本形式。人们的书写习惯是中缀式,如:11+22*(7-4)/3。中缀式的计算按运算符的优先级与括号优先的原则,相同级别从左到右进行计算。表达式还有后缀式(如:22 7 4 - * 3 / 11 +)和前缀式(如:+ 11 / * 22 – 7 4 3)。后缀表达式和前缀表达式中没有括号,给计算带来方便。如后缀式计算时按运算符出现的先后进行计算。本设计的主要任务是进行表达式形式的转换与不同形式的表达式计算。 2. 数据结构设计 (1)表达式求值问题 由于表达式中有字符与数字两种类型,故定义结点一个标志域data,标志结点存储的为字符data=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. 运行、测试与分析 (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<stdio.h> #include<stdlib.h> #define MAXNUM 100 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; typedef 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 &e) //运算数栈,入栈:插入元素e为新的栈顶元素 { if(s.top-s.base>=MAXNUM) printf("出错:表达式过长!1\n"); *s.top++ =e; } void GetTop1(sqstack1 s,selemtype1 &e) //运算数栈,用e返回栈顶元素 {e=*(s.top-1); } void Popopnd1(sqstack1 &s,selemtype1 &e) //运算数栈,退栈:删除栈顶元素,并用e返回其值 {e=*--s.top; } int stackempy1(sqstack1 s) //运算数栈,若为空栈返回1,否则返回0 {if(s.top==s.base) return 1; else return 0; } typedef char selemtype2; //定义运算符栈的结点类型 typedef struct //定义运算符栈类型 {selemtype2 *base; selemtype2 *top; }sqstack2; void InitStack2(sqstack2 &s) //新建一个空运算符栈 {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("出错:表达式过长!2\n"); *s.top++ =e; } void GetTop2(sqstack2 s,selemtype2 &e) //运算符栈,用e返回栈顶元素 {e=*(s.top-1); } void Popopnd2(sqstack2 &s,selemtype2 &e) //运算符栈,退栈:删除栈顶元素,并用e返回其值 {e=*--s.top; } int stackempy2(sqstack2 s) //运算符栈,若为空栈返回1,否则返回0 {if(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,反之返回0 {int in,out; priority(a,in); priority(b,out); if(out>in) 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;break; 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*num2;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: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) {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(compare(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 houzhui(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->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); 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=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); 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); 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("结点有误"); 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)); 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=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; default: 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(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 n[10]; char c; int i,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(struct Node)); first=p; printf("请输入中缀表达式"); do { c = getchar(); if('0'<=c&&c<='9') { n[i]=c; i++; } else { switch (c) { case '+': case '-': case '*': case '/': case '%': case '(': case ')': case '\n': { if(n[0]>'0'&&n[0]<='9') { q=(Lnode*)malloc(sizeof(struct Node)); p->next=q; p=p->next; for(k=0;k<i;k++) { for(j=0;j<=i-k-2;j++) e=e*10; a=a+(n[k]-'0')*e; e=1; n[k]='0'; } p->data=1; p->data1=a; i=0;a=0; } if(c!='\n') { if(p->data==2) { if(p->data2!=')'&&c!='(') b=0; } 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!='+'&&c!='-'&&c!='*'&&c!='/'&&c!='%'&&c!='\n'&&c!='('&&c!=')') b=0; } } }while (c != '\n'); if(z!=y) b=0; p->next=NULL; if(b==0) printf("输入中缀表达式有误"); else {printf("输入1中缀表达式求值,输入2后缀表达式求值,输入3前缀表达式求值"); scanf("%d",&b); if(b==1) zhongzhui(first); if(b==2) houzhui(first); if(b==3) qianzhui(first); } return 1; } 20 / 20
    展开阅读全文
    提示  咨信网温馨提示:
    1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
    2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
    3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
    4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
    5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
    6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

    开通VIP折扣优惠下载文档

    自信AI创作助手
    关于本文
    本文标题:C语言实现中缀、后缀、前缀表达式-相互转化并求值.doc
    链接地址:https://www.zixin.com.cn/doc/4498024.html
    页脚通栏广告

    Copyright ©2010-2026   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


    关注我们 :微信公众号  抖音  微博  LOFTER               

    自信网络  |  ZixinNetwork