数据结构课程设计 实验报告.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构课程设计 实验报告 题目:2.3 表达式求值问题 问题描述 表达式是数据运算的基本形式。人们的书写习惯是中缀式,如:11+22*(7-4)/3。中缀式的计算按运算符的优先级及括号优先的原则,相同级别从左到右进行计算。表达式还有后缀式(如:22 7 4 — *3/11 +)和前缀式(如:+ 11/*23—7 4 3)。后缀表达式和前缀表达式中没有括号,给计算带来方便。如后缀式计算时按运算符出现的先后进行计算。本设计的主要任务是进行表达式形式的转换及不同形式的表达式计算。 数据结构设计 本题中使用顺序栈用来存取运算符和运算数,顺序栈类的定义如下: //顺序栈类定义 template class T class SqStack { private: T *base;//栈底指针 int top;//栈顶 int stacksize;//栈容量 public: SqStack(int m);//构建函数 ~SqStack(){delete [] base;top=0;stacksize=0;}//析构函数 void Push(T x);//入栈 T Pop();//出栈 T GetTop();//获取栈顶元素 int StackEmpty();//测栈空 void ClearStack();//清空栈 void StackTop();//返回栈顶指针 void StackTranverse();//显示栈中元素 }; 算法设计 本题中规定的功能涉及的算法有:中缀表达式求值、将中缀表达式转换为后缀表达式、将中缀表达式转换为前缀表达式、后缀表达式求值、前缀表达式求值。 中缀表达式求值 ①首先定义了两个栈,分别用于存取运算符和运算数,如下: SqStackchar OP(20); SqStackdoubleOD(20); ②然后依次读取表达式的一个字符C,如果C是运算数,入运算数栈OP.Push(C); 如果C是运算符,把它与栈顶元素的优先级比较: 若“”:该运算符进栈,读入下一个字符,OP.Push(c);若“=”:运算符退栈,消去一个括号读入下一个字符; 若“”,从运算符栈退出一个运算符,从运算数栈里退出两个运算数进行运算,并将结果入运算数栈。 这时需用到比较运算符优先级的函数:char Precede(char t1,char t2) //算符的优先级比较 重复上述过程直到把表达式扫描完,操作数栈的栈顶元素为计算结果。算法如下: case:OP.Push(c); // 栈顶元素优先权低 c=*exp++; break; case=:x=OP.Pop(); // 脱括号并接收下一字符 c=*exp++; break; case:theta=OP.Pop();// 退栈并将运算结果入栈 if(theta==(||theta==)) { cout表达式有误!; exit(0); } b=OD.Pop(); if(b==0) { cout表达式有误!endl; exit(0); } if(OD.StackEmpty()) { cout表达式有误!endl; exit(0); } a=OD.Pop(); OD.Push(Operate(a,theta,b)); } (2)将中缀表达式转换为后缀表达式 ①从左向右读取表达式,读到运算数把它输出; ②读到运算符f2,把运算符栈顶元素的算符优先级f1进行比较: 若“f1f2”:该运算符入运算符栈; 若“f1=f2”:从运算符栈退出一个运算符,不输出; 若“f1f2”,从运算符栈退出一个运算符,从运算数栈里输出所有比f2优先级高的运算符,直至栈顶算符优先级小于f2,f2入运算符栈。 具体算法如下: case:OP.Push(c); // 栈顶元素优先权低 c=*exp++;break; case=:x=OP.Pop(); // 脱括号并接收下一字符 c=*exp++;break; case:postexp[i++]=OP.Pop();break; // 运算符出栈输出 (3)将中缀表达式转换为前缀表达式 ①将中缀式入栈再依次从栈中读取元

文档评论(0)

bm5044 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档