数据结构课程设计之算术表达式求值_第1页
数据结构课程设计之算术表达式求值_第2页
数据结构课程设计之算术表达式求值_第3页
数据结构课程设计之算术表达式求值_第4页
数据结构课程设计之算术表达式求值_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

..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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论