- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
河北联合大学数据结构报告正文
一、设计思想
设计目标是用两种算法实现中缀式转后缀式,并计算出表达式的值。
第一种算法是给出一个中缀式,编译运行后输出后缀式,并计算后缀式的值。首先,先创建两个数组,一个用于存储输入的中缀式,并以“#”结束,一个用于输出后缀式。创建一个操作符栈,初始化并写好出入栈函数,用操作符栈存储操作符。对中缀表达式进行遍历时,遇到数值就直接输入要输出后缀表达式的数组,遇到操作符时,首先对操作符的优先级进行设置,“*”,“/”,“%”的优先级设置为最高,“+”“-”的优先级低于前三个符号,“#”的优先级设置为最低。对操作符栈进行操作时首先将“#”放入栈顶。判断栈顶操作符与当前操作符优先级的大小,若当前操作符优先级大的话直接入栈,若当前操作符小于或者等于栈顶运算符的话栈顶操作符出栈,并输入后缀式所在的数组,当前操作符再入栈,遇到“(”时,此时认为“(”的优先级为最高,直接入栈,但是当它入栈后优先级变为最小,当栈顶为“(”时操作符可以直接入栈,其他操作符直接入栈直至遇到“)”时,与“(”配对,括号之间的所有操作符全部出栈并输入后缀式。继续遍历中缀式。当遍历到“#”时认为遍历中缀式结束。此时操作符栈所有操作符出栈并输入后缀式,打印后缀式。得到后缀式后,声明并初始化数值栈,写入入栈出栈函数,对后缀式进行遍历,遇到数值直接入栈,每遇到操作符,从数值栈栈顶取两个数进行计算,将运算结果入数值栈,继续遍历后缀式直至表达式结束,得到的结果就是后缀式的计算值。
第二种算法不将中缀式转换为后缀式,而是直接对中缀式进行操作,开始声明并初始化栈,一个操作符栈,一个数值栈。直接对中缀式进行遍历,同时也要声明操作符的优先级,“*”,“/”,“%”的优先级设置为2,“+”,“-”的优先级设置为1,然后开始遍历中缀式,遇到字符时首先判断字符类型,也就是sort值,当sort为1时表示读到的是操作符,入操作符栈,当sort为2时读到的是数,入数值栈,遇到数值直接入栈,遇到“(”时,设置其优先级为零,但是直接入栈,不用比较优先级大小,直至遇到“)”时才出操作符栈。操作符入栈时要进行优先级的比较,若大于栈顶操作符的优先级直接入栈,否则操作符栈的栈顶操作符先出栈,当前操作符再入栈,每当有操作符出栈时,都要从数值栈栈顶出来两个数进行运算,运算结果再压入数值栈中,直至表达式遍历结束。结束时看数值栈和操作符栈是否为空,不为空的话操作符栈元素出栈,从数值栈顶取两个元素进行计算,计算结果再次压入数栈,如此循环直至操作符栈为空,计算结果压入数值栈中,得到的结果就是中缀表达式的值。得到的结果就是double类型数据。调用sprintf函数,此函数用于将各种类型的数据转化为字符串并将其输出。
二、算法流程图
图1为扫描并存储中缀式,遍历中缀式时读到数字或者小数点时直接入要输出后缀式的数组,读到操作符时入操作符栈,入栈前先跟操作符栈顶操作符进行优先级比较,优先级大直接入栈,否则栈顶操作符出栈输入后缀表达式所在数组,当前操作符再入栈,直至读到“#”为止。
图2为计算机后缀表达式,此时遍历后缀表达式,读到数直接入数栈,每读到运算符就从数栈出来两个数进行计算,计算结果压入数栈,直至遍历结束。计算结果就是表达式的值。
图3为算法二的流程图,不用将中缀表达式转换成后缀表达式,而是直接进行处理,遇到数入数栈,遇到操作符先进行优先级比较,若栈顶运算符优先级大于或者等于当前运算符,栈顶运算符出栈并从数栈取两个数进行计算,计算结果入数栈,当前运算符再入栈。如此循环直至遍历表达式结束。
图1 中缀转后缀算法流程图
图2 后缀表达式计算算法流程图
图3 直接处理中缀表达式算法流程图
三、源代码
下面给出的是用中缀式转后缀式再计算结果算法实现的程序的源代码:
#includestdio.h
#define StackSize 100 /*定义栈大小为100*/
typedef struct{ /*定义数值栈*/
double array[StackSize]; /*定义数值类型为双精度浮点数*/
int top;
}OdNode; /*数值栈名为OdNode*/
typedef char ElemType;
typedef struct{ /*定义操作符栈*/
ElemType array[StackSize];
int top;
}OpNode; /*操作符栈名为OpNode*/
void OdInit(OdNode * Od){ /*初始化数值栈,由指针s指出*/
Od-top=-1;}
您可能关注的文档
最近下载
- 行进间低手投篮教案.doc VIP
- (正式版)H-Y-T 250-2018 无居民海岛开发利用测量规范(正式版).docx VIP
- “增材制造项目”—第二届职业技能大赛甘肃省选拔赛—技能试卷(样题).pdf VIP
- 日照城市介绍PPT模板.pptx VIP
- DLT 5219-2023 架空输电线路基础设计规程.pdf VIP
- 附睾炎护理查房.pptx VIP
- 跨学科实践“用'水透镜'探究近视眼的形成原因”(教学课件)物理沪粤版2024八年级上册.pptx VIP
- 2025年新人教版语文八年级上册全册教学设计.docx
- 华为认证ICT工程师HCIA考试(习题卷5).pdf VIP
- 招商运营专员岗位面试题及答案.docx VIP
原创力文档


文档评论(0)