算式计算器C语言版
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计说明书
课程名称:数据结构
设计题目:表达式计算程序设计
学院:计算机科学与信息工程学院
学生姓名:
学生学号:
专业班级:计算机科学与技术嵌入式(12-1) 指导教师:冯贺
2014年6月16 日
课程设计任务书
表达式计算程序设计
摘要:
按照要求构造运算符优先级表,编写优先级比较算法。利用栈结构和优先级编写表达式计算方法。首先构建了一个数据栈,此栈用来储存浮点型数字;一个符号栈用来存储运算符号。然后借助于两个栈和一个结构体运算。
关键词:
栈优先级比较算法优先级表
目录
1.设计背景 (1)
………1 1.1数据结构算法设计…………………………………………
1.2知识运用 (1)
2.设计方案 (1)
2.2程序设计方案 (1)
2.2模块设计方案 (1)
3.方案实施………………………………………………………………
2
.........2 3.1模块代码.....................................................................6 3.1流程图...............................................................4.测试 (8)
5.总结……………………………………………………………………
10
.........10 3.1总结........................................................................10 3.1谢词...............................................................6.参考文献 (10)
7.附件……………………………………………………………………
11
1. 设计背景
1.1数据结构算法设计
1、王亚洲完成了对符号栈的编写
2、王秀文完成了对数字栈的编写
3、李渊完成了对符号结构题的编写和对符号结构体数组的初始化
4、童世超完成了对字符数字转化为浮点型数字
5、曾冰寒完成对主函数的编写
1.2知识运用
学完数据结构,充分利用所学栈的知识,完成表达式程序设计
2.设计方案
2.1程序设计方案
先定义一个结构体,用来存放符号和优先级和定义两个栈,一个数字栈、一个符号栈。然后借助于符号结构体和两个栈通过逻辑算法设计一个表达式计算程序
2.2模块设计方案
该模块是表达式计算的核心模块即计算模块。先判断接收的是不是左括号,左括号的优先级最低,如果是左括号无条件入栈;如果不是左括号则判断是不是右括号,右括号的优先级最高,遇到右括号无条件出栈运算,然后循环知道遇见左括号把括号的全部运算完毕然后继续接收字符;如果既不是左括号也不是右括号则判断是不是运算符,如果是运算符则判断和运算符栈的栈顶元素的优先级,如果栈顶元素的优先级等于或高于接收元素则出栈运算否则入栈;最后判断是不是等号,如果是等好则出栈运算,一直到数字栈中就剩下最后一个元素结果这输出结果,运算结束。
1
3. 方案实施
3.1模块代码
if('('==c) //左括号时入栈
{
Push(S,c); //左括号入符号栈
c=getchar(); //接着读下一个字符
}
else if(')'==c) //当是右括号时计算括号内的内容
{
Pop(S,a); //符号栈出栈
if('('==a) //判断刚出栈的符号是不是左括号
{
c=getchar(); //如果是左括号说明括号内运算完了,接收下个字符
}
else //不是左括号说明没运算玩,接着运算
{
SPop(Z,q); //数字栈出栈,用于运算
SPop(Z,p); //数字栈出栈,用于运算
SPush(Z,Operate(p,a,q)); //调用Operate计算,然后把计算结果入数字栈
2
}
}
else if('+'==c||'-'==c||'*'==c||'/'==c)//当是运算符的时候判断前一个运算符,前一个运算符高的时候运算
{ //否则入栈
if(0==StackLength(S)) //判断符号栈是否为空
{
Push(S,c); //符号入符号栈
c=getchar(); //接着接收下个字符
}
else if(fuhao(GetTop(S),c)>=0) //调用fuhao函数判断栈顶元素和刚接收的符号的优先级
{ //如果栈顶元素优先级高活相等就运算
Pop(S,a); //符号出栈
SPop(Z,q); //数字出栈
SPop(Z,p); //数字出栈
SPush(Z,Operate(p,a,q));//调用Operate计算,然后把计算结果入数字栈
}
else //如果刚接收的符号的优先级高则入栈
{
3
Push(S,c); //符号入符号栈
c=getchar(); //接着接收下个字符
}
}
else if('='==c) //当是等号的时候
{
//当输入等号时符号栈中应该至少有一个符号,数字栈中应该有两个数字
Pop(S,a); //符号栈出栈
SPop(Z,q); //数字栈出栈
SPop(Z,p); //数字栈出栈
SPush(Z,Operate(p,a,q));//调用Operate计算,然后把计算结果入数字栈
if(1==SStackLength(Z)) //判断数字栈是否就剩一个数字
{ //如果就剩一个数字则说明运算结束
if(0!=StackLength(S))//判断符号栈是否为空
{ //运算结束符号栈应该为空,不为空则说明输入错误牰湩晴尨输入有错!\n);//错误提示
return ; //结束该函数
}
SPop(Z,n); //最后一个数字即运算结果出栈
4