利用栈求表达式的值_第1页
利用栈求表达式的值_第2页
利用栈求表达式的值_第3页
利用栈求表达式的值_第4页
利用栈求表达式的值_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

题目:利用栈求表达式的值一设计任务和目标编写程序实现表达式求值,即验证某算术表达式的正确性,若正确,则计算该算术表达式的值。主要功能描述如下:1、从键盘上输入表达式。2、分析该表达式是否合法:(1)是数字,则判断该数字的合法性。若合法,则压入数据到堆栈中。(2)是规定的运算符,则根据规则进行处理。在处理过程中,将计算该表达式的值。(3)若是其它字符,则返回错误信息。 主要功能描述如下:1、从键盘上输入表达式。2、分析该表达式是否合法:(1)是数字,则判断该数字的合法性。若合法,则压入数据到堆栈中。(2)是规定的运算符,则根据规则进行处理。在处理过程中,将计算该表达式的值。(3)若是其它字符,则返回错误信息。程序应包括以下几个功能函数void initstack();初始化堆栈int Make_str();语法检查并计算int push_operate(int operate):将操作码压入堆栈int push_num(double num):将操作数压入堆栈int procede(int operate):处理操作码 int change_opnd(int operate):将字符型操作码转换成优先级int push_opnd(int operate):将操作码压入堆栈int pop_opnd();将操作码弹出堆栈int caculate(interru_opnd):简单计算 +,-,*,/double pop_num():弹出操作数程序如下:#include stdio.h#include string.h#include stdlib.h#define MAXLEN 100typedef struct char op; int level;opt;typedef struct /定义操作符栈 opt stMAXLEN; int top;op_stack;typedef struct /定义值栈 double DMAXLEN; int top;D_stack;/-对栈操作的定义-opt peek(op_stack *s) /定义看栈顶函数 opt error=; if(s-top=0) return s-sts-top; else return error;int IsEmpty(op_stack *s) /定义判断栈空的函数 if(s-topsts-top.op;char push(op_stack *s,opt c) /定义入栈函数 s-top+; s-sts-top=c; return c.op;opt pop(op_stack *s) /定义出栈函数 opt i; opt error=; if(s-top=0) i=s-sts-top; s-sts-top.op=0; s-top-; return i; else return error;void clear(op_stack *s) /定义初始化栈 s-top=-1;/-define the value stack-double Dpeek(D_stack *s) /定义看栈顶函数 if(s-top=0) return s-Ds-top; else return 0;int DIsEmpty(D_stack *s) /定义判断栈空的函数 if(s-topDs-top);double Dpush(D_stack *s,double c) /定义入栈函数 s-top+; s-Ds-top=c; return c;double Dpop(D_stack *s) /定义出栈函数 double i; if(s-top=0) i=s-Ds-top; s-Ds-top=0; s-top-; return i; else return 0;void Dclear(D_stack *s) /定义初始化栈 s-top=-1;double calval(char *exp) op_stack os; /定义两个栈 D_stack ds; char tmpMAXLEN=; int i=0,leng; double dtmp,dpoptmp; opt A=; opt R=; opt M=; opt D=; opt B=; opt Mo=; clear(&os); Dclear(&ds); /-定义初始化结束- while(*exp!=0) while(*exp = 0 & *exp = 0 & *exp = 9 | *exp = .) tmpi+=*exp+; dtmp=atof(tmp); Dpush(&ds,dtmp); leng=strlen(tmp); for(i=0;ileng;i+) tmpi=0; i=0; /- switch(*exp) case + : if(!IsEmpty(&os) | peek(&os).level =A.level) switch(pop(&os).op) case %: dpoptmp=Dpop(&ds); dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp); Dpush(&ds,dpoptmp); break; case * : dpoptmp=Dpop(&ds)*Dpop(&ds); Dpush(&ds,dpoptmp); break; case / : dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)/dpoptmp; Dpush(&ds,dpoptmp); break; case +: dpoptmp=Dpop(&ds)+Dpop(&ds); Dpush(&ds,dpoptmp); break; case -: dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)-dpoptmp; Dpush(&ds,dpoptmp); break; push(&os,A); *exp+; break; case -: if(!IsEmpty(&os) | peek(&os).level =R.level) switch(pop(&os).op) case % : dpoptmp=Dpop(&ds); dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp); Dpush(&ds,dpoptmp); break; case * : dpoptmp=Dpop(&ds)*Dpop(&ds); Dpush(&ds,dpoptmp); break; case / : dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)/dpoptmp; Dpush(&ds,dpoptmp); break; case +: dpoptmp=Dpop(&ds)+Dpop(&ds); Dpush(&ds,dpoptmp); break; case -: dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)-dpoptmp; Dpush(&ds,dpoptmp); break; push(&os,R); *exp+; break; case *: if(!IsEmpty(&os) | peek(&os).level =M.level) switch(pop(&os).op) case % : dpoptmp=Dpop(&ds); dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp); Dpush(&ds,dpoptmp); break; case * : dpoptmp=Dpop(&ds)*Dpop(&ds); Dpush(&ds,dpoptmp); break; case / : dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)/dpoptmp; Dpush(&ds,dpoptmp); break; push(&os,M); *exp+; break; case /: if(!IsEmpty(&os) | peek(&os).level =D.level) switch(pop(&os).op) case % : dpoptmp=Dpop(&ds); dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp); Dpush(&ds,dpoptmp); break; case * : dpoptmp=Dpop(&ds)*Dpop(&ds); Dpush(&ds,dpoptmp); break; case / : dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)/dpoptmp; Dpush(&ds,dpoptmp); break; push(&os,D); *exp+; break; case %: if(!IsEmpty(&os) | peek(&os).level =Mo.level) switch(pop(&os).op) case % : dpoptmp=Dpop(&ds); dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp); Dpush(&ds,dpoptmp); break; case * : dpoptmp=Dpop(&ds)*Dpop(&ds); Dpush(&ds,dpoptmp); break; case / : dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)/dpoptmp; Dpush(&ds,dpoptmp); break; push(&os,Mo); *exp+; break; case (: push(&os,B); exp+; break; case ): while(peek(&os).level!=-2) switch(pop(&os).op) case % : dpoptmp=Dpop(&ds); dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp); Dpush(&ds,dpoptmp); break; case * : dpoptmp=Dpop(&ds)*Dpop(&ds); Dpush(&ds,dpoptmp); break; case / : dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)/dpoptmp; Dpush(&ds,dpoptmp); break; case +: dpoptmp=Dpop(&ds)+Dpop(&ds); Dpush(&ds,dpoptmp); break; case -: dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)-dpoptmp; Dpush(&ds,dpoptmp); break; pop(&os); /弹出 ( exp+; break; while(IsEmpty(&os) switch(pop(&os).op) case % : dpoptmp=Dpop(&ds); dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp); Dpush(&ds,dpoptmp); break; case * : dpoptmp=Dpop(&ds)*Dpop(&ds); Dpush(&ds,dpoptmp); break; case / : dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)/dpoptmp; Dpush(&ds,dpoptmp); break; case +: dpoptm

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论