- 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、数据结构设计
存储中缀表达式和存储后缀表达时均使用一维数组。进行中缀表达式转化为后缀表达式时使用存储字符的栈,进行后缀表达式计算的时候使用存储数字的栈。具体数据结构定义如下:
#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)