用两种方式实现表达式自动计算解读.doc

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构(双语) ——项目文档报告 用两种方式实现表达式自动计算 专 业: 计算机科学与技术 班 级: 14接计 指导教师: 姓 名: 学 号: 目 录 一、设计思想……………………………………………………….03 二、算法流程图…………………………………………………….04 三、源代码………………………………………………………….06 四、运行结果……………………………………………………….13 五、遇到的问题及解决…………………………………………….14 六、心得体会……………………………………………………….15 一、设计思想 1.中缀转换后缀: ⑴定义两个栈S1,与S2。S1主要管转换专用,S2主要管计算专用。 ⑵扫描字符串,如果是字符或者小数的,直接进栈。 ⑶如果是“(”,同直接进栈,直到遇到“)”,为止。 ⑷开始处理运算符。 ⑸如果栈定的运算符的优先级低于读到的那个,那么就直接进栈,否则把栈里的都进数组里。 ⑹运算完,直到读完为止。返回字符数组,后缀表达式就出来了。 ⑺然后计算后缀表达。 ⑻开始依次扫描数组,如果是数,就进栈,如果是运算符,那么就把栈的数弹出一个,赋值给一个变量,再弹一个赋值一个变量,再进行计算,完后再进栈。 ⑼重复过程,直到度完。栈顶元素就是最终结果。 ⑽结束。 2.中缀直接计算: ⑴如果获取的操作符a的优先级高于操作符栈栈顶元素b的优先级,则a直接入操作符栈; ⑵如果获取的操作符a的优先级低于操作符栈栈顶元素b的优先级,则b出栈,a进栈,并且取出操作数栈的栈顶元素m,再取出操作数栈新的栈顶元素n,如果b为+,则用n+m,若为减号,则n-m,依此类推,并将所得结果入操作数栈; ⑶如果获取的是“(”,则直接进操作符栈; ⑸如果获取的是“)”,则操作符栈的栈顶元素出栈,做类似于情况2的计算,之后把计算结果入操作数栈,再取操作符栈顶元素,如果不是“(”,则出栈,重复操作,直到操作符栈顶元素为“(”,然后“(”出栈; ⑹当表达式中的所有元素都入栈后,看操作符栈中是否还有元素,如果有,则做类似于情况2 的计算,并将结果存入操作数栈,则操作数栈中最终的栈顶元素就是所要求的结果。 二、算法流程图 1.后缀 2.中缀直接计算 三、源代码 1.后缀表达式 #includestdio.h #include string.h #includestdlib.h #include string #include stack #includealgorithm #include fstream.h #define MAXN 1000 using namespace std; stackchar S1; //定义栈S1 ,转换专用 stackdouble S2; //定义栈S2,计算专用 char *tranfExp(char* exp) //变换后缀 { char tempStr[1000];//保存后缀表达式的字符串 char ch; int i=0,j=0; int a=0; //标记表达式是否正确专用 /// int b=0; //标记数字格式是否正确待用 while(exp[i] !=\0) { if((exp[i]=0 exp[i]=9)||exp[i]==.) //数字直接进字符串 { tempStr[j++] = exp[i]; // tempStr[j] = ; } else if(exp[i] == ( ) //左括号蹦进栈S1 { S1.push(exp[i]); } else if(exp[i] == ) ) //如果是右括号,就把左括号后面的运算符都进字符串

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档