模拟计算器.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文档。上传文档
查看更多
模拟计算器

模拟计算器 1、问题描述 编写一个模拟计算器的程序,要求对包含加、减、乘、除、括号运算符的任意整型表达式进行求解。 2、设计思路 利用一个数组存储表达式,利用存储字符的栈将中缀表达式转化为后缀表达式,在转化过程中注意字符的进出栈以及操作数的优先级。继而再利用存储数字的栈计算后缀表达式。此计算的重点是区分单位数字和多位数字。这里使用在操作数后面加“#”以示区分。 3、数据结构设计 存储中缀表达式和存储后缀表达时均使用一维数组。进行中缀表达式转化为后缀表达式时使用存储字符的栈,进行后缀表达式计算的时候使用存储数字的栈。具体数据结构定义如下: #define MAXSIZE 100 char infixexp[MAXSIZE],postfixexp[MAXSIZE]; //建立数字栈 typedef struct { double data[MAXSIZE]; int top; }NumSeqStack,*PNumSeqStack; //建立字符栈 typedef struct { char data[MAXSIZE]; int top; }StrSeqStack,*PStrSeqStack; 4、功能函数设计 (1)判断是否为操作数IsNum(char) 如果当前字符是0~9之前的字符,则说明当前字符为操作数,返回值为1,否则当前字符为操作符,返回值为0。 (2)中缀表达式转为后缀表达式infix_exp_value(char ,char ) 表达式作为一个满足表达式语法规则的串存储,转换过程为:初始化一个算符栈,并将结束符“=”放入栈中,然后自左向右扫描表达式,直到扫描到“=”并且当前栈顶也是“=”时结束。当扫描到的是操作数时直接输出,扫描到算符时不能马上输出,因为后面可能还有更高优先级的运算,要对下列几种情况分别处理: 算符栈栈顶算符是“(”,如果当前扫描到的算法是“)”,则算法出栈不作任何处理,同时扫描下个字符,此过程称脱括号;如果当前扫描到的算符不是“)”,则当前算符进栈。 算符栈栈顶算符不是“(”并且算符栈栈顶符优先级比当前扫描到的算符优先级低,则入栈;若算符栈栈顶算符优先级比当前扫描到的算符优先级高(或相等),则从算符栈出栈并输出,当前算符继续与新的栈顶算符比较。 如果当前扫描到的是操作数,则直接输出。并判断下一个字符是否为操作数,如果是则继续输出,不是则输出“#”。 (4)后缀表达式求值postfix_exp(char ) 只使用一个操作数栈,当从左向右扫描表达式时,当扫描到操作数时,并继续扫描直到扫描到“#”停止。将扫描到的操作数转换成对应的整数并送入栈中保存。每遇到一个运算符就从栈中取出两个操作数进行当前的计算,然后把结果再入栈,直到整个表达式结束,这时送入栈顶的值就是结果。 5、编码实现 #includestdio.h #includestdlib.h #includemath.h #includeconio.h #define MAXSIZE 100 //建立数字栈 typedef struct { double data[MAXSIZE]; int top; }NumSeqStack,*PNumSeqStack; //初始化空栈 PNumSeqStack Init_NumSeqStack(void) { PNumSeqStack S; S=(PNumSeqStack )malloc(sizeof(NumSeqStack)); if(S) S-top=-1; return S; } //判空栈 int Empty_NumSeqStack(PNumSeqStack S) { if(S-top==-1) return 1; else return 0; } //出栈 int Push_NumSeqStack(PNumSeqStack S,double x) { if(S-top==MAXSIZE-1) return 0; else { S-top++; S-data[S-top]=x; return 1; } } //出栈 int Pop_NumSeqStack(PNumSeqStack S,double *x) { if(Empty_NumSeqStack(S)) return 0; else { *x=S-data[S-top]; S-top--; return 1; } } //取栈顶元素 int GetTop_NumSeqStack(PNumSeqStack S,double *x) { if(Empty_NumSeqStack(S)) return 0; else { *x=S-data[S-to

文档评论(0)

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

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

1亿VIP精品文档

相关文档