




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
..1[实验题目及要求][问题描述]一个算术表达式是由操作数<operand>、运算符<operator>和界限符<delimiter>组成的。假设操作数是正实数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符"#",如:#〔7+15*〔23-28/4#。引入表达式起始、结束符是为了方便。编程利用"算符优先法"求算术表达式的值。[基本要求]〔1从键盘或文件读入一个合法的算术表达式,输出正确的结果。〔2显示输入序列和栈的变化过程。〔3考虑算法的健壮性,当表达式错误时,要给出错误原因的提示。<4>实现非整数的处理〔可选功能。2[源代码〔C语言]#include<stdio.h>#include<stdlib.h>#include<string.h>#defineMAXSIZE20#defineOK1#defineERROR0#defineOVERLOW0#defineYES1#defineNO0typedefstruct{char*base;char*top;intstacksize; //最大存储量}OPTR; //字符存储栈typedefstruct{float*base;float*top;intstacksize; //最大存储量}OPND; //数值存储栈intInitOptrStack<OPTR*>; //字符栈初始化函数intOptrPush<OPTR*,char>; //进字符栈操作intOptrPop<OPTR*,char*>; //出字符栈操作intOptrEmpty<OPTR>; //判断字符栈是否为空charGetOptrTop<OPTR>; //返回字符栈顶元素intInitOpndStack<OPND*>; //数值栈初始化函数intOpndPush<OPND*,float>; //进数值栈操作intOpndPop<OPND*,float*>; //出数值栈操作intOpndEmpty<OPND>; //判断数值栈是否为空intJudgeChar<char>; //判断是否为字符floatGetFloat<char*>; //接收一个数字charPrecede<char,char>; //判断优先级操作floatCaculate<float,float,char>;//计算数值voidmain<>{charch,noMean,ci;floatnum,number1,number2;OPTRoptr;OPNDopnd;//system<"color30">; InitOptrStack<&optr>; InitOpndStack<&opnd>;while<1>{ printf<" 请输入表达式以"#"开始,以"#"结束\n ">;do{ ch=getchar<>; }while<ch!='#'>; //忽略前面非‘#’字符 OptrPush<&optr,ch>; ch=getchar<>;while<ch!='#'||GetOptrTop<optr>!='#'>{if<!JudgeChar<ch>>{ //如果输入的是数字 num=GetFloat<&ch>; OpndPush<&opnd,num>; }else{ //输入的是字符switch<Precede<GetOptrTop<optr>,ch>>{case'<': OptrPush<&optr,ch>; //栈顶优先级低 ch=getchar<>;break;case'=': OptrPop<&optr,&noMean>; //左右括号,把左括号出栈 ch=getchar<>;break;case'>': //栈顶优先级高if<OpndPop<&opnd,&number2>&&OpndPop<&opnd,&number1>>{ OptrPop<&optr,&ci>; num=Caculate<number1,number2,ci>; //出栈计算 OpndPush<&opnd,num>; }else{ printf<" 输入过多运算符!\n">; system<"PAUSE">; exit<0>; }break; }//witch }//else }if<opnd.top-opnd.base>=2>{ printf<" 俩个括号之间缺少运算符!\n ">; system<"PAUSE">; exit<0>; } OpndPop<&opnd,&num>; //直接把OPND的栈元素赋值给num printf<" 运算结果为%.3f\n",num>; } system<"PAUSE">;}intInitOptrStack<OPTR*OP>{OP->base=<char*>malloc<<MAXSIZE+1>*sizeof<char>>;OP->top=OP->base;OP->stacksize=MAXSIZE;returnOK;}intOptrPush<OPTR*OP,charch>{ *<OP->top>=ch;OP->top++;returnOK;}intOptrPop<OPTR*OP,char*ch>{if<OP->base==OP->top>returnERROR;else{OP->top--; *ch=*<OP->top>;returnOK; }}intOptrEmpty<OPTROP>{if<OP.top==OP.base>returnYES;elsereturnNO;}charGetOptrTop<OPTROP>{return*<OP.top-1>;}intInitOpndStack<OPND*OP>{if<!<OP->base=<float*>malloc<<MAXSIZE+1>*sizeof<float>>>> exit<OVERLOW>;OP->top=OP->base;OP->stacksize=MAXSIZE;returnOK;}intOpndPush<OPND*OP,floatnumber>{ *<OP->top>=number;OP->top++;returnOK;}intOpndPop<OPND*OP,float*number>{if<OP->top==OP->base>returnERROR;else{OP->top--; *number=*<OP->top>;returnOK; }}intOpndEmpty<OPNDOP>{if<OP.top==OP.base>returnYES;elsereturnNO;}intJudgeChar<charch>{if<ch>='0'&&ch<='9'>returnNO;elsereturnYES;}floatGetFloat<char*ch>{inti;floatnum=0;for<i=0;*ch>='0'&&*ch<='9';i++>{ num=num*10+*ch-'0'; *ch=getchar<>; }returnnum;}charPrecede<chara,charb>{charch;switch<a>{case'+': case'-': if<b=='*'||b=='/'||b=='<'> ch='<';else ch='>';break;case'*':case'/': if<b=='<'> ch='<';else ch='>';break;case'<': if<b=='>'> ch='=';elseif<b=='#'>{ printf<" 缺少反括号\n">; system<"PAUSE">; exit<0>; }else ch='<';break;case'>': if<b=='<'>{ printf<" 两个括号之间没有符号相连!\n">; system<"PAUSE">; exit<0>; } ch='>';break;case'#': if<b=='#'> ch='=';elseif<b=='>'>{ printf<" 没有左括号!\n ">; system<"PAUSE">; exit<0>; }else ch='<';break;default: printf<" 输入运算符超出范围! \n ">; system<"PAUSE">; exit<0>;break; }returnch;}floatCaculate<floatnumber1,floatnumber2,charci>{floatnum;switch<ci>{case'+': num=number1+number2; break;case'-': num=number1-number2; break;case'*': num=number1*number2; break;case'/': num=number1/number2; break; }returnnum;}3[算法思想]根据栈的原理,建立数字栈OPND和运算符号栈OPTR,对读入的字符进行判断,存入不同的栈内,每次读入一个字符就把该字符和运算符栈顶的优先级进行比较,然后选择相应的操作,这是这个程序的核心代码,如下:switch<Precede<GetOptrTop<optr>,ch>>{ case'<': OptrPush<&optr,ch>; //栈顶优先级低 ch=getchar<>; break; case'=': OptrPop<&optr,&noMean>; //左右括号,把左括号出栈 ch=getchar<>; break; case'>': //栈顶优先级高 if<OpndPop<&opnd,&number2>&&OpndPop<&opnd,&number1>>{ OptrPop<&optr,&ci>; num=Caculate<number1,number2,ci>; //出栈计算 OpndPush<&opnd,num>; }else{
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教育技术对在线学习的推动作用
- 协作学习中教育技术工具的应用与影响
- 学习科学引领教育革新之路
- 混合式教学模式下的课程设计与实施策略分析
- 教育技术在医疗培训中的创新应用案例分析
- 新教育政策对特殊教育的支持与推动
- 抖音商户客服客诉升级处理时限制度
- 抖音商户直播样品视频制作流程制度
- 八大城市教育行业教育培训机构市场营销策略与品牌建设报告
- 公交优先战略视角下2025年城市交通拥堵治理效果评价体系构建报告
- 专业技术人员职务聘任书
- GB/T 307.4-2017滚动轴承推力轴承 产品几何技术规范(GPS)和公差值
- GB 29415-2013耐火电缆槽盒
- 《密码法》培训只是讲座PPT课件(带内容)
- 如何解读血常规报告
- 区域消防安全风险评估规程DB50-T 1114-2021
- 免疫调节治疗在脑卒中的运用课件
- 机关档案管理工作培训PPT课件
- 25T汽车吊检验报告
- 变频空调中的永磁电机电感分析
- 高考常考语法填空词性转换汇总
评论
0/150
提交评论