《c语言实现中缀后缀前缀表达式相互转化并求值》由会员分享,可在线阅读,更多相关《c语言实现中缀后缀前缀表达式相互转化并求值(21页珍藏版)》请在人人文库网上搜索。

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

2、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)按提示输入中缀表达式,如图所示。如输入中缀表达式不正确,提示输入有误,如图,所示。 图 图 图 (2)选择表达式转换并求值方式。按“1”选择中缀表达式求值,如图所示。 图 ”选择中缀表达式转变为后缀表达式并求值,如图所示。2)按“3(图 (4)按“3”选择中缀表达式转变为前缀表达式并求值,如图所示。 图 附录:源代码 (1)表达式求值问题 #include #define MAXNUM 100 typedef struct Node /定义存储中缀表达式的结点类型 int data; int data1; char data2; struc。

4、t 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) /新建一个空运算数栈 =(selemtype1 *)。

5、malloc(MAXNUM*sizeof(selemtype1); =; 椠?牰湩晴尨出错:申请空间失败!n); void Push1(sqstack1 &s,selemtype1 &e) /运算数栈,入栈:插入元素e为新的栈顶元素 ?晩?牰湩晴尨出错:表达式过长!1n); *+ =e; void GetTop1(sqstack1 s,selemtype1 &e) /运算数栈,用e返回栈顶元素 e=*; void Popopnd1(sqstack1 &s,selemtype1 &e) /运算数栈,退栈:删除栈顶元素,并用e返回其值 e=*; int stackempy1(sqstack1 s)。

6、 /运算数栈,若为空栈返回1,否则返回0 if= return 1; else return 0; 定义运算符栈的结点类型typedef char selemtype2; /typedef struct /定义运算符栈类型 selemtype2 *base; selemtype2 *top; sqstack2; void InitStack2(sqstack2 &s) /新建一个空运算符栈 =(selemtype2 *)malloc(MAXNUM*sizeof(selemtype2); =; 椠?牰湩晴尨出错:申请空间失败!n); void Push2(sqstack2 &s,selemtyp。

7、e2 &e) /运算符栈,入栈:插入元素e为新的栈顶元素 ?晩?牰湩晴尨出错:表达式过长!2n); *+ =e; void GetTop2(sqstack2 s,selemtype2 &e) /运算符栈,用e返回栈顶元素 e=*; void Popopnd2(sqstack2 &s,selemtype2 &e) /运算符栈,退栈:删除栈顶元素,并用e返回其值 e=*; int stackempy2(sqstack2 s) /运算符栈,若为空栈返回1,否则返回0 if= return 1;else return 0; void priority(char c,int &i) /确定运算符优先级 。

8、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(outin) return 1; else return 0; void Operat(sqstack1 &OPND,sqstack2 &OPTR) int num1,num2,num; char c; Popopnd1(OPND,num2); Popopn。

9、d1(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); P。

10、opopnd1(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;。

11、 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; ?敤慦汵?牰湩晴尨结点有误); break; p=p-next; Popopnd1(OPND,n); e=n; void zhongzhui(Lnode *p) /中缀表达式求值 sqstack1 OPND; /运算数栈 sqstack2 OPT。

12、R; /运算符栈 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(O。

13、PTR,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; ?搠晥畡瑬?牰湩晴尨结点有误); break; p=p-next; while(!stackempy2(OPTR) Operat(OPND,OPTR); Popopnd1(OPND,n); p=first-。

14、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。

15、) 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。

16、-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; ?搠晥畡瑬?牰湩晴尨结点有误); break; p=p-next; while(!stackempy2(OPTR) Po。

17、popnd2(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) /前缀表达式求值 sqsta。

18、ck1 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; ?敤慦汵?牰湩晴尨结点有误); break; p=p-next; Popopnd1(O。

19、PND,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-p。

20、rior=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-。

21、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(OP。

22、TR,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; ?搠晥畡瑬瀺楲瑮?结点有误); break; q=q-prior; while(!stackempy2(OPTR) Popopnd2(OPTR,c2);r=。

23、(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 n10;char c; int i,j,k,a,b,z,y。

24、,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; ?牰湩晴尨请输入中缀表达式); do c = getchar(); if(00&n0next=q; p=p-next; for(k=0;kdata=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-。

25、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) ?牰湩晴尨输入中缀表达式有误); else 笠牰湩晴尨输入1中缀表达式求值,输入2后缀表达式求值,输入3前缀表达式求值); scanf(%d,&b); if(b=1) zhongzhui(first); if(b=2) houzhui(first); if(b=3) qianzhui(first); return 1;。

pnd1 c语言,c语言实现中缀后缀前缀表达式相互转化并求值相关推荐

  1. 前缀中缀后缀表达式的计算求值

    原文在这里 表达式 前缀表达式(波兰表达式) 前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前 举例说明: (3+4)×5-6 对应的前缀表达式就是 - × + 3 4 5 6 前缀表达式求值 ...

  2. C语言实现中缀转后缀表达式,并求值

    C语言实现中缀转后缀表达式,并求值 #include <stdio.h> #include <stdlib.h> #include <ctype.h> #inclu ...

  3. 使用栈解决的一类经典问题:表达式转换及求值;中缀表达式;前缀表达式,后缀表达式,中缀转前缀;中缀转后缀;后缀表达式求值;波兰式,逆波兰式

    文章目录 背景知识 表达式转换问题(考研经典) 一:手工转换 (1)中缀转前缀和中缀转后缀 (2)前缀转中缀和后缀转中缀 二:用栈实现表达式转换 (1)中缀转后缀 (2)中缀转前缀 表达式计算问题(使 ...

  4. R语言 表达式对象的求值 eval

    R语言 表达式对象的求值 eval 模式为 "expression"的对象在Expression objects 有具体定义.它们和引用对象的列表非常相似. > ex < ...

  5. 数据结构:前缀,中缀,后缀表达式(逆波兰表达式)

    前缀表达式(波兰表达式) 前缀表达式的运算符位于操作数之前. 比如 (1+2)*3-4  对应的前缀表达式就是: - * + 1 2 3 4 前缀表达式的计算机求值 从右至左扫描表达式,遇到数字时,就 ...

  6. 中缀表达式转换为前缀及后缀表达式并求值【摘】

    它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前:中缀和后缀同理. 举例: (3 + 4) ...

  7. 前缀(波兰表达式) 中缀 后缀(逆波兰表达式)

    前缀.中缀.后缀表达式(逆波兰表达式) 本文转自https://www.cnblogs.com/chensongxian/p/7059802.html 介绍 前缀表达式.中缀表达式.后缀表达式都是四则 ...

  8. 前缀表达式,中缀表达式和后缀表达式的定义与联系(超详细)

    目录 前缀.中缀.后缀表达式 前缀表达式 前缀表达式的计算机求值 中缀表达式 后缀表达式 后缀表达式的计算机求值 中缀表达式转化为前缀和后缀表达式 小结 前缀.中缀.后缀表达式 前缀.中缀.后缀表达式 ...

  9. 【数据结构与算法】【12】前缀表达式、中缀表达式、后缀表达式

    什么是前缀表达式.中缀表达式.后缀表达式 前缀表达式.中缀表达式.后缀表达式,是通过树来存储和计算表达式的三种不同方式 以如下公式为例 (a+(b−c))∗d( a+(b-c) )*d(a+(b−c) ...

最新文章

  1. 一种PacBio测序数据组装得到的基因组序列的纠错方法
  2. python中fn的用法_Pytorch技巧:DataLoader的collate_fn参数使用详解
  3. UCLA教授遭到举报后被停课!原因竟是不同意学生主张的“考试放水”
  4. mac实际上是非常适合编程的,我之前的认识的确是有些有限的
  5. UVa439 Knight Move 骑士的移动(bfs)
  6. Map接口与学习系列(一)
  7. 图灵测试是不是已经Out了
  8. 【音视频安卓开发 (一)】AndroidStudio项目配置权限、jni库路径、ABI、Cmake
  9. python 类变量(属性)和实例变量(属性
  10. Java获取成员变量构造函数信息
  11. linux目录/etc/nc.d/nc.local开机启动项无效
  12. django在linux一直跑
  13. matlab实现机器学习算法-回归分析
  14. 管家婆服务器端口修改,211端口被占用,如何设置
  15. ABB机器人RobotStudio编程指令大全
  16. 服务器上行带宽和下行带宽指的是什么
  17. PGP在加密技术中的应用
  18. 必应词典软件案例分析
  19. 本地计算机用户组,管理本地用户与组账户
  20. 高德地图引用,搜索定位

热门文章

  1. 借贷宝:人情社会也需要契约精神
  2. 日更100天(24)每天进步一点点
  3. Android的数据存储方式,如数据库的基本操作和三级缓存实现--
  4. Java基础之IO模型
  5. 20202413 2021-2022-2 《网络与系统攻防技术》实验二实验报告
  6. 十招让Win10跑得更快
  7. 解决VM VirtualBox无法调节分辨率
  8. Power BI基础知识——连接数据源
  9. HUAWEI HiLink
  10. 2015-06-12