版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
..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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2030年中国人工麝香行业市场竞争策略及投资价值研究报告
- 2024-2030年中国亚克力(PMMA)产业前景预测与投资可行性分析报告
- 2024-2030年中国不锈钢材行业发展状况规划分析报告
- 2024-2030年中国三元氯醋树脂行业产能预测及发展可行性研究报告
- 2024-2030年中国X射线试验台行业市场发展趋势与前景展望战略分析报告
- 2024-2030年中国PVC复合稳定剂行业销售策略与盈利前景预测报告
- 2024-2030年中国IT运维服务行业运营模式及投资前景规划分析报告
- 2024-2030年v中国酸化油行业发展风险投资规划分析报告
- 2024-2030年中国除湿干燥机行业应用趋势与需求规模预测报告
- 2024年历史文化遗址修复个人劳务分包合同
- 单人徒手心肺复苏操作评分表(医院考核标准版)
- 教育数字化背景下的创新教学方法及效果评估研究
- 教育政策分析与效果评估
- TAD水泥墙施工方案
- 《初二班会课件:班级管理与自我管理》
- 第六课《黑与白》(说课稿)人教版(2012)美术三年级上册
- 本科毕业设计-年产110万吨氧化铝石灰拜耳法溶出车间设计
- 新教科版科学六年级上册期末综合测试卷(五)
- 提高住院病历完成及时性持续改进(PDCA)
- 因孩子上学房子过户协议书
- 部编版四年级语文上册课内阅读复习试题含答案全套
评论
0/150
提交评论