- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
实验二栈和队列实现四则运算
实用文档
实验二栈和队列实现四则运算
一、实验目的及要求:
1、掌握栈和队列的基本操作:建立、插入、删除、查找、合并
2、掌握用栈和队列的储存
3、熟悉C语言上机编程环境
4、掌握编译、调试程序的方法
二、实验内容:
采用栈进行表达式的求值,表达式求值是程序设计语言编译中的一个最基本问题。它的实现是栈应用的又一个典型例子,本报告使用的是“算符优先法”求表达式的值。
要把一个表达式翻译成正确求值的一个机器指令序列,或者直接对表达式求值,首先要能够正确解释表达式。若要正确翻译则首先要了解算术四则运算的规则。即:
(1)、先乘除,后加减;
(2)、从左算到右;
(3)、先括号内后括号外。
任何一个表达式都是由操作数、运算符和界限符组成的,我们称它们为单词。一般地,操作数既可以是常数也可以是被说明为变量或常量的标识符;运算符可以分为算术运算符、关系运算符和逻辑运算符3类;基本界限符有左右括号和表达式结束符等。为了叙述的简洁,我们仅讨论简单算术表达式的求值问题。这种表达式只包含加、减、乘、除4种运算符。
我们把运算符和界限符统称为算符,它们构成的集合命名为OP。根据上述3条运算规则,在运算的每一步中,任意两个相继出现的算符和之间的优先级之多是以下3种关系之一:
的优先级低于
的优先级等于
的优先级高于
根据实际情况推导出如下的优先关系
算符间的优先关系表
+
-
*
/
(
)
#
+
-
*
/
)
)
#
=
有规则(3),+、-、*和/为时优先性均低于“(”但高于“),”由规则(2),当时,令,“#”是表达式的结束符。为了算法简洁,在表达式左右括号的最左边也虚设了一个“#”构成整个表达式的一对括号。表中的“(”=“)”表示当左右括号相遇时,括号内的运算已经完成。同理,“#”=“#”表示整个表达式求值完毕。“)”与“(、“#”与“)”以及“(”与“#”之间无优先级,这是因为表达式中不允许它们相继出现,一旦遇到这种情况,则可以认为出现语法错误。
为实现算符优先算法,可以使用两个栈。一个称作OPTR,用以寄存运算符;另一个称作OPND,用以寄存操作数户哟运算结果。算法的基本思想是:
(1)首先输入一个表达式,用一数组记录;
(2)置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素;
(3)依次读入表达式中的每个字符,若是操作数则进OPND栈,若是运算符则和OPTR栈的栈顶元素比较优先权后作相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为“#”)。
三、程序代码
#includestdio.h
#includestdlib.h
#includestring.h
#defineerror0//错误标志
#defineok1//正确标志
#defineoverflow-1//溢出标志
#defineStack_Size100//一般表达式运算符和运算数不会很长,100足够用
#defineOP_Size7//一共7种运算符
charOP[OP_Size]={+,-,*,/,(,),#};//运算符
unsignedcharPrior[7][7]={
,,,,,,,
,,,,,,,
,,,,,,,
,,,,,,,
,,,,,=,,
,,,,,,,
,,,,,,=
};//算符间的优先关系
templatetypenameT
structSqStack
{
T*top;
T*base;
intstacksize;
};//顺序栈结构模板
templatetypenameT1,typenameT2
intInitStack(T1S)
{
S.base=(T2*)malloc(Stack_Size*sizeof(T2));
if(!S.base)exit(overflow);
S.top=S.base;
S.stacksize=Stack_Size;
returnok;
}//初始化栈函数模板
templatetypenameT1,typenameT2
intPush(T1S,T2e)
{
if(S.top-S.base=S.stacksize)
{
S.base=(T2*)realloc(S.base,(S.stacksize+1)*sizeof(T2));
if(!S.base)exit(overflow);
S.top=S
您可能关注的文档
最近下载
- mba讲国学之易经精华(ppt 60页)课件课件.pptx VIP
- 精准医疗行业市场发展现状及前景趋势与投资分析研究报告(2024-2030版).docx
- 《电力系统继电保护原理及仿真》于群、曹娜(电子课件-图片格式)第6章.pptx VIP
- 民法典物权编解读 答案 .pdf VIP
- 2015.3.26《红楼梦》中的易经理论.ppt VIP
- 基于PWM控制的直流电动机调速系统设计毕业设计论文.pdf VIP
- 国际贸易实务(第四版·数字教材版) 课后习题答案.pdf VIP
- 《汽车发动机构造与原理》课件.ppt VIP
- 香港十二生肖电邮子票资料.docx VIP
- 有效的团队建设及管理课件.pptx VIP
原创力文档


文档评论(0)