用栈的方式实现表达式求值.doc_第1页
用栈的方式实现表达式求值.doc_第2页
用栈的方式实现表达式求值.doc_第3页
用栈的方式实现表达式求值.doc_第4页
用栈的方式实现表达式求值.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

一、程序设计任务 掌握栈的用法,实现表达式求值这一栈的典型应用问题:以字符序列的形式从终端输入语法正确的、不含变量的算术表达式,利用算符优先关系,实现对算术四则混合运算表达式求值。当用户输入一个合法的表达式后,能够返回正确的结果。能够计算的运算符包括:加、减、乘、除、括号 。二、具体代码实现如下#include#include#include #include#include#include /cstdio本来就只是将stdio.h的内容用C+的头文件形式表现出来。 #define NULL 0 typedef struct node /定义一个结点结构体char date; struct node *next; SNode; SNode *InitStack()/初始化空链栈 SNode *top; top=new SNode;/top=(SNode *)malloc(sizeof(SNode); top-next=NULL; return top; void PushOptr(SNode *top,char x)/运算符进栈函数 SNode *p; p=new SNode; p-date=x; p-next=top-next; top-next=p; char PopOptr(SNode *top)/运算符出栈函数 SNode *p; char x; if(top=NULL) return NULL; p=top-next; x=p-date; top-next=p-next; delete p; return x; void PushOpnd(SNode *top,char x)/操作数进栈函数 SNode *p; p=new SNode; p-date=x; p-next=top-next; top-next=p; char PopOpnd(SNode *top)/操作数出栈函数 SNode *p; char x; if(top=NULL) return NULL; p=top-next; x=p-date; top-next=p-next; delete p; return x; char GetTop(SNode *top)/取栈顶元素 return (top-next)-date; int In(char c) int n; switch(c) case +: case -: case *: case /: case (: case ):case %:case :case #: n=1;break; default : n=0;break; return n; char Precede(char x,char y) /符号优先级规则说明 int i,j; int form99=1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,0,-1,-1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,2,-1,-1,0; /定义一个二维数组存放运算符优先级switch(x) case +:i=0;break; case -:i=1;break; case *:i=2;break; case /:i=3;break; case (:i=4;break; case ):i=5;break; case %:i=6;break;case :i=7;break;case #:i=8;break; switch(y) case +:j=0;break; case -:j=1;break; case *:j=2;break; case /:j=3;break; case (:j=4;break; case ):j=5;break; case %:j=6;break;case :j=7;break;case #:j=8;break; if(formij=1) /当formij=1时,说明运算符i的优先级高于运算符jreturn ; else if(formij=-1) /当formij=-1时,说明运算符i的优先级低于运算符jreturn ; else /当formij等于其他值时,说明运算符i的优先级等于运算符jreturn =; int Operate(char x,char z,char y)/操作函数 int a=x-0,b=y-0; switch(z) case +:return a+b; case -:return a-b; case *:return a*b; case /:return a/b; case %:return a%b; case : for(int i=1;ib;i+) a*=a; return a;/coutpow(a,b); char Eval_Exp(char t) /获取运算结果 char temp30; strcpy(temp,t); strcat(temp,#);char a,b,c,r,f,z; int result,i=0; SNode *top2; top0=InitStack(); /top0指向栈顶PushOptr(top0,#); /将#进入空运算符栈top1=InitStack(); c=tempi; while(c!=#|(GetTop(top0)!=#)/输入符号不为#或者栈顶元素不为#时执行while语句 if(!In(c) /如果当前输入不为运算符时执行if语句 PushOpnd(top1,c); /将输入的元素放入操作数栈中c=temp+i; else r=Precede(GetTop(top0),c); /获取符号优先级比较结果switch(r) case :b=PopOptr(top0); /出当前运算符栈中的栈顶元素a=PopOpnd(top1); /出当前操作数栈中栈顶元素 z=PopOpnd(top1); /出当前操作数栈中栈顶元素 result=Operate(z,b,a); /计算结果 f=result+0; PushOpnd(top1,f); /将运算结果进操作数栈中 break; return f; /返回运算结果 void main() char infilename40,outfilename40,ch30;fstream infile;fstream outfile;coutinfilename;infile.open(infilename,ios:in|ios:nocreate);if(!infile)cout不能打开文件:infilenameendl;exit(1);coutoutfilename;outfile.open(outfilename,ios:out);if(!outfile)cout

温馨提示

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

评论

0/150

提交评论