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

上传人:hs****ma 文档编号:511519645 上传时间:2023-12-05 格式:DOCX 页数:27 大小:92.93KB
返回 下载 相关 举报
c语言实现中缀、后缀、前缀表达式相互转化并求值_第1页
第1页 / 共27页
c语言实现中缀、后缀、前缀表达式相互转化并求值_第2页
第2页 / 共27页
c语言实现中缀、后缀、前缀表达式相互转化并求值_第3页
第3页 / 共27页
c语言实现中缀、后缀、前缀表达式相互转化并求值_第4页
第4页 / 共27页
c语言实现中缀、后缀、前缀表达式相互转化并求值_第5页
第5页 / 共27页
点击查看更多>>
资源描述

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

1、1. 问题描述( 1)表达式求值问题表达式是数据运算的基本形式。人们的书写习惯是中缀式,如:11+22*(7-4)/3。中缀式的计算按运算符的优先级及括号优先的原则,相同级别从左到右进行计算。表达式还有后缀式(如:2274-*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)按提示输入中缀表达式,如图所示。如输入中缀表达式不正确,提示输入有误,如图 , 所示。图图图(2)选择表达式转换并求值方式。按“1”选择中缀表达式求值, 如图所示。图(3)按“ 2”选择中缀表达式转变为后缀表达式并求值,如图所示。图(4)按“ 3”选择中缀表达式转变为前缀表达式并求值,如图所示。图附录:源代码( 1)表达式求值问题#include#include#define MAXNUM 100typedef struct Node/定义存储中缀表达式的结点类型int data;int data1;char data2;struct Node

4、 *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 *)malloc(MAXNUM*sizeof(sel

5、emtype1);=;if(! printf(出错:申请空间失败! n);void Push1(sqstack1 &s,selemtype1 &e)/运算数栈,入栈:插入元素 e 为新的栈顶元素 if printf(出错:表达式过长! 1n); *+ =e;void GetTop1(sqstack1s,selemtype1&e)/运算数栈,用 e 返回栈顶元素e=*;void Popopnd1(sqstack1 &s,selemtype1&e) /运算数栈,退栈:删除栈顶元素,并用 e 返回其值e=*;int stackempy1(sqstack1 s)/运算数栈,若为空栈返回1,否则返回 0

6、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);=;if(! printf(出错:申请空间失败! n);void Push2(sqstack2 &s,selemtype2 &e)/运算符栈,入栈:插入元素 e 为

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

8、if (c=+|c=-) i=1 ;else i=0;intcompare(char a,charb)/比较栈顶元素运算符与外部运算符优先级大小,外部优先级大则返回1,反之返回 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)ca

9、se +: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

10、=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;Pus

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 活动策划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号