数据结构算术表达式求值实验报告

合集下载

算术表达式求值-数据结构实验报告

算术表达式求值-数据结构实验报告

//存放运算数的栈的顺序存储表示
//存放运算符的栈的顺序存储表示
void InitStack(SqStack *S) //构造空栈(运算数 栈) { S->base=(float*)malloc((STACK_INIT_SIZE)*sizeof(float)); S->top=S->base; S->stacksize=STACK_INIT_SIZE; } void initStack(sqStack *S) //构造空栈(运算符 栈) { S->base=(char*)malloc((STACK_INIT_SIZE)*sizeof(char)); S->top=S->base; S->stacksize=STACK_INIT_SIZE; } float GetTop(SqStack *S) //用e返回栈顶元素(运
初始条件:a, b为整数,OP为运算符。 操作结果:a与b进行运算,OP为二元运算符,返回其值。 }ADT Stack (2)符号之间的优先权关系比较 <:的优先权低于: =:的优先权等于 >:的优先权高于 + + * / ( ) # > > > > < > < > > > > < > < * < < > > < > < / < < > > < > < < ( < < < < < ) > > > > = > > = # > > > >
//用e返回栈顶元素

(完整word版)数据结构表达式求值实验报告

(完整word版)数据结构表达式求值实验报告

《数据结构》课程设计报告书题目: 表达式求值系别:计算机科学与信息系学号:学生姓名:指导教师:完成日期:目录➢1.前言➢2.概要设计2。

1 数据结构设计2.2 算法设计2.3 ADT描述2。

4 功能模块分析➢3。

详细设计3.1 数据存储结构设计3.2主要算法流程图(或算法代码)➢4.软件测试➢5。

总结➢附录1.前言在计算机中,算术表达式由常量、变量、运算符和括号组成。

由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行.因而在程序设计时,借助栈实现。

算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。

为简化,规定操作数只能为正整数,操作符为+、-*、/,用#表示结束。

算法输出:表达式运算结果。

算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。

在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。

2.概要设计2.1 数据结构设计任何一个表达式都是由操作符,运算符和界限符组成的。

我们分别用顺序栈来寄存表达式的操作数和运算符.栈是限定于紧仅在表尾进行插入或删除操作的线性表。

顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,base为栈底指针,在顺序栈中,它始终指向栈底,即top=base可作为栈空的标记,每当插入新的栈顶元素时,指针top增1,删除栈顶元素时,指针top减1。

2.2 算法设计为了实现算符优先算法。

可以使用两个工作栈。

一个称为OPTR ,用以寄存运算符,另一个称做OPND ,用以寄存操作数或运算结果。

1。

首先置操作数栈为空栈,表达式起始符”#"为运算符栈的栈底元素;2.依次读入表达式,若是操作符即进OPND 栈,若是运算符则和OPTR 栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR 栈的栈顶元素和当前读入的字符均为"#")。

数据结构表达式求值实验报告

数据结构表达式求值实验报告

竭诚为您提供优质文档/双击可除数据结构表达式求值实验报告篇一:数据结构实验二——算术表达式求值实验报告《数据结构与数据库》实验报告实验题目算术表达式求值学院:化学与材料科学学院专业班级:09级材料科学与工程系pb0920603姓学邮名:李维谷号:pb09206285箱:指导教师:贾伯琪实验时间:20XX年10月10日一、需要分析问题描述:表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。

设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。

问题分析:在计算机中,算术表达式由常量、变量、运算符和括号组成。

由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。

因而在程序设计时,借助栈实现。

设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。

在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。

在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。

算法规定:输入形式:一个(:数据结构表达式求值实验报告)算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。

为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。

输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。

程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。

测试数据:正确输入:12*(3.6/3+4^2-1)#输出结果:194.4无定义运算:12*(3.6/(2^2-4)+1)#输出结果:表达式出错,除数为0,无意义错误输入:12+s#输出结果:eRRoR!二、概要设计拟采用两种类型的展分别对操作数和操作符进行操作。

数据结构表达式求值实验报告

数据结构表达式求值实验报告

数据结构表达式求值实验报告一、设计人员相关信息1. 设计者姓名、学号和班号:12地信李晓婧 120122429832. 设计日期:2014.3. 上机环境:VC++6.0二、程序设计相关信息1(实验题目:用户输入一个包含+、-、*、/、正整数和圆括号的合法算术表达式,计算该表达式的运算结果。

2(实验项目组成:先将算术表达式转换成后缀表达式,然后对改后缀表达式求值。

3(实验项目的程序结构(程序中的函数调用关系图):mainLeftpririghpriinopprecedetranscompvalue4(实验项目包含的各个文件中的函数的功能描述: , rightpri(char op) //求右运算符的优先级, rightpri(char op) //求右运算符的优先级, inop(char ch) //判断CH是否为运算符 , precede(char op1,char op2) //OP1和OP2运算符优先级的比较 , compvalue(char *postexp) //计算后缀表达式5(算法描述或流程图:#include<stdio.h>#include<stdlib.h>#define maxop 50#define maxsize 50struct{ char ch;int pri;}lpri[]={{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6}}, rpri[]={{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}};int leftpri(char op) //求左运算符的优先级{ int i;for(i=0;i<maxop;i++)if(lpri[i].ch==op)return lpri[i].pri;}int rightpri(char op) //求右运算符的优先级{ int i;for(i=0;i<maxop;i++)if(rpri[i].ch==op)return rpri[i].pri;}int inop(char ch) //判断CH是否为运算符{ if(ch=='('||ch==')'||ch=='+'||ch=='-'||ch=='*'||ch=='/') return true;elsereturn false;}int precede(char op1,char op2) //OP1和OP2运算符优先级的比较{ if(leftpri(op1)==rightpri(op2))return 0;else if (leftpri(op1)<rightpri(op2))return -1;elsereturn 1;}void trans(char *exp,char postexp[]){ struct{char data[maxsize]; //存放运算符int top; //栈指针}op; //定义一个运算符int i=0;op.top=-1;op.top++; //将=进栈op.data[op.top]='='; while(*exp!='\0') //EXP表达式没扫描完时循环{ if(!inop(* exp)) {while(* exp>='0'&& * exp<='9') //判断为数字{ postexp[i++]= * exp;exp++;}postexp[i++]='#'; //用#表示一个数值串结束 }elseswitch(precede(op.data[op.top], * exp)){case -1: //栈顶运算符的优先级低op.top++;op.data[op.top]= * exp;exp++;break;case 0:op.top--;exp++;break;case 1: //退栈并输出到POSTEXP中postexp[i++]=op.data[op.top];op.top--;break;}}while (op.data[op.top]!='='){ postexp[i++]=op.data[op.top];op.top--;}postexp[i]='\0';}float compvalue(char *postexp) //计算后缀表达式 { struct {float data[maxsize]; //存放数值int top;}st; //定义一个运算数栈 float d,a,b,c;st.top=-1;while(* postexp!='\0') //POSTEXP字符串未扫描时循环{ switch(*postexp) {case'+': //判定+a=st.data[st.top];st.top--; //退栈取数值Ab=st.data[st.top];st.top--; //退栈取数值,c=a+b; //计算Cst.top++;st.data[st.top]=c;break;case'-': //判断-a=st.data[st.top];st.top--; //退栈取Ab=st.data[st.top];st.top--; //退栈取Bc=b-a;st.top++;st.data[st.top]=c; //将计算结果进栈break;case'*':a=st.data[st.top];st.top--;b=st.data[st.top];st.top--;c=a*b;st.top++;st.data[st.top]=c;break;case'/':a=st.data[st.top];st.top--;b=st.data[st.top];st.top--;if(a!=0){ c=b/a;st.top++;st.data[st.top]=c;}else{printf("\n\t除零错误!\n");exit(0); //异常退出}break;default: //处理数字字符{ d=0;while(* postexp>='0'&& *postexp<='9') //判断为数字字符postexp++;}st.top++;st.data[st.top]=d;break;}postexp++; //继续处理其他字符)}return(st.data[st.top]); }void main(){ char exp[]="(50-20)/(4+2)";char postexp[maxsize];trans(exp,postexp);printf("中缀表达式:%s\n",exp);printf("后缀表达式:%s\n",postexp);printf("表达式的值:%g\n",compvalue(postexp)); }6(实验数据和实验结果:7(出现的问题及解决方法: 问题1:解决方法:修改宏定义,将maxop的值改小。

数据结构表达式求值实验报告

数据结构表达式求值实验报告

实验报告课程名:数据结构(C语言版)实验名:表达式求值姓名:班级:学号:时间:2014.10.25一实验目的与要求1. 了解栈的应用2. 利用栈进行算术表达式求值二实验内容1.以字符串的形式给出一个算术表达式, 计算出该算术表达式的值。

2.表达式中可能出现”+”, ”−”, ”∗”, ”/”, ”(”, ”)”。

三实验结果与分析分析:r:读入字符t:栈顶字符r( ) # 低优先运算符高优先运算符( 入栈出栈错误入栈入栈) 错误错误错误错误错误t # 入栈错误结束入栈入栈低优先运算符入栈出栈+运算出栈+计算出栈+计算入栈高优先运算符入栈出栈+运算出栈+计算出栈+计算出栈+计算1, 入栈2, 错误3, 出栈4, 出栈+计算5, 结束( ) # 低优先运算符高优先运算符( 1 3 2 1 1) 2 2 2 2 2# 1 2 5 1 1低优先运算符 1 4 4 4 1高优先运算符 1 4 4 4 4此实验可用两个栈和数组来实现,一个操作栈,一个数字栈,两个栈的字符进行优先权比较可得到5种结果。

首先置操作栈为空栈,表达式起始符“#”作为数字栈的栈底元素,依次读入表达式的每个字符,若是操作字符进操作栈,若是数字进数字栈,操作栈和数字栈的栈顶元素比较优先权后进行相应操作,直至结束,最后输出值即可。

实验程序:#include<stdio.h>#include<stdlib.h>#include<string.h>int change(char c)//字符转换{int j=-1;switch(c){case '(':j=0;break;case ')':j=1;break;case '#':j=2;break;case '+':j=3;break;case '-':j=3;break;case '*':j=4;break;case '/':j=4;break;}return(j);}int compu(int x,int y,char c)//数字计算转换{int j=-1;switch(c){case '+':j=x+y;break;case '-':j=x-y;break;case '*':j=x*y;break;case '/':j=x/y;break;}return(j);}void get(char a[],int num_op,int method[5][5]){int a_length=strlen(a)+1;//表达式的长度int p=0,num_p=0,op_p=0;int *num_s=(int *)malloc((a_length)*sizeof(int));// char *op_s=(char *)malloc((a_length)*sizeof(int));// op_s[op_p]='#';op_p++;//进字符栈int k=-1;//输出结果判断int ox,oy;while(1){char c=a[p];//将表达式中的字符一个一个赋值给cif(c>='0'&&c<='9')//判断是不是数字{num_s[num_p]=c-48;//将Ascll码转换成对应数字num_p++;//进数字栈p++;//代表表达式的位置开始为0指向第一位}else{int t=method[change(op_s[op_p-1])][change(c)];//将5种操作的一种传给tswitch(t){case 1:op_s[op_p]=c;op_p++;p++;break;case 2:k=0;break;case 3:op_p--;p++;break;case 4:ox=num_s[num_p-2];oy=num_s[num_p-1];num_p=num_p-2;num_s[num_p]=compu(ox,oy,op_s[op_p-1]);//将计算的值存入num_s[]num_p++;//入数字栈op_p--;break;case 5:k=1;break;}}if(k>=0)//跳出循环{break;}}switch(k)//0错误,1输出结果{case 0:printf("表达式错误!");break;case 1:printf("%s=%d\n",a,num_s[num_p-1]);break;}}int main(int argc,char *argv[]){ char a[20];puts("请输入个位数的表达式:");gets(a);int num_op=5;//表示操作的种数int method[5][5]={{1,3,2,1,1},{2,2,2,2,2},{1,2,5,1,1},{1,4,4,4,1},{1,4,4,4,4}};//1表示入栈,2表示错误,//3表示出栈,4表示出栈+计算,//5表示结束get(a,num_op,method);return 0;}图1.表达式求值运行结果。

数据结构表达式求值实验报告

数据结构表达式求值实验报告

数据结构表达式求值实验报告数据结构表达式求值实验报告第一章引言数据结构是计算机科学中重要的基础知识之一,它研究的是数据在计算机中的存储和组织方式,以及基于这些方式进行操作和运算的算法。

表达式求值是数据结构中一个重要的应用场景,它涉及到从一个给定的表达式中计算出最终结果的过程。

本实验旨在通过实际编程实践,掌握表达式求值的算法和数据结构的应用。

第二章实验目的1.理解表达式的概念。

2.熟悉常见表达式求值算法。

3.掌握栈的基本操作。

4.实现一个表达式求值的程序。

第三章实验内容1.表达式的定义:________表达式是由运算符和运算数组成的字符串,它代表了一种计算规则。

2.表达式的分类:________根据运算符的位置和计算顺序,表达式可以分为前缀表达式、中缀表达式和后缀表达式。

3.表达式求值的算法:________1. 前缀表达式求值算法:________1) 创建一个空栈。

2) 从右往左遍历前缀表达式。

3) 如果当前字符是运算符,则将栈顶的两个元素出栈,进行相应的运算,将结果入栈。

4) 如果当前字符是运算数,则将其转化为整数形式,并入栈。

5) 最终栈内只剩下一个元素,即为表达式的求值结果。

2. 中缀表达式求值算法:________1) 将中缀表达式转化为后缀表达式。

2) 创建一个空栈。

3) 从左往右遍历后缀表达式。

4) 如果当前字符是运算符,则将栈顶的两个元素出栈,进行相应的运算,将结果入栈。

5) 如果当前字符是运算数,则将其转化为整数形式,并入栈。

6) 最终栈内只剩下一个元素,即为表达式的求值结果。

3. 后缀表达式求值算法:________1) 创建一个空栈。

2) 从左往右遍历后缀表达式。

3) 如果当前字符是运算符,则将栈顶的两个元素出栈,进行相应的运算,将结果入栈。

4) 如果当前字符是运算数,则将其转化为整数形式,并入栈。

5) 最终栈内只剩下一个元素,即为表达式的求值结果。

4.实验代码实现:________根据算法描述,使用编程语言实现一个表达式求值的程序。

数据结构表达式求值(中缀)实验报告

数据结构表达式求值(中缀)实验报告

数据结构表达式求值(中缀)实验报告题目名称表达式求值学号姓名指导教师日期一1. 问题描述:在计算机中,算术表达式由常量、变量、运算符和括号组成。

由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行,在程序设计时,借助栈实现。

2. 表达式求值这个程序,主要利用栈和数组,把运算的先后步骤进行分析并实现简单的运算,以字符列的形式从终端输入语法的正确的、不含变量的整数表达式。

利用已知的算符优先关系,实现对算术四则运算的求值,在求值中运用栈、运算栈、输入字符和主要操作的变化过程。

该程序相当于一个简单的计算机计算程序,只进行简单的加减乘除和带括号的四则运算。

1、基本思想(中缀表达式求值)要把一个表达式翻译成正确求值的一个机器指令序列,或者直接对表达式求值,首先要能够正确解释表达式,要了解算术四则运算的规则即:(1)先乘除后加减;(2)从左到右计算;(3)先括号内,后括号外。

下表定义的运算符之间的关系:b + - * / () # a+ > > < < < > > _ > > < < < > > * > > > > < > > / > > > > < > > ( < < < < < = ) > > > > > > # < < < < < =为了实现运算符有限算法,在程序中使用了两个工作栈。

分别是:运算符栈OPTR,操作数栈OPND.基本思想:(1)首先置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素;(2)依次读入表达式中每个字符,若是操作数则进OPND栈,若是运算符则和OPTR栈得栈顶运算符比较优先级后作相应操作。

表达式求值实验报告

表达式求值实验报告

表达式求值实验报告西南大学数据结构实验报告学院:专业:班级:姓名:学号:实验报告一、实验题目:表达式表达式二、实验目的和建议:目的:(1)通过该算法的设计思想,熟识栈的特点和应用领域方法;(2)通过对波函数优先法对算术表达式表达式的算法继续执行过程的模拟,认知在继续执行适当栈的操作方式时的变化过程。

(3)通过程序设计,进一步熟识栈的基本运算函数;(4)通过自己动手同时实现算法,强化从伪码算法至c语言程序的同时实现能力。

建议:(1)采用栈的顺序存储则表示方式;(2)采用波函数优先法;(3)用c语言同时实现;(4)从键盘输入一个符合要求的算术表达式,输入恰当的结果。

三、实验过程:#include#include#include#include#include#include#include#include#include#inclu de#include//函数结果状态代码#definetrue1#definefalse0#defineok1#defineerror0#defineinfeasible-1typedefintstatus;//status就是函数的类型,其值就是函数结果状态代码,如ok等typedefintelemtype;constintstack_init_size=100;constintstackincrement=10;typed efstruct{elemtype*base;elemtype*top;intstacksize;}stack;statusinitstack(stack&s){//构造一个空栈ss.base=(elemtype*)malloc(stack_init_size*sizeof(elemtype));if(!s.base)exit(er ror);s.top=s.base;s.stacksize=stack_init_size;returnok;}statuspush(stack&s,ele mtypee){//插入元素e为新的栈顶元素if(s.top-s.base>=s.stacksize){s.base=(elemtype*)realloc(s.base,(s.stacksize+stackincrem ent)*sizeof(elemtype));if(!s.base)exit(overflow);s.top=s.base+s.stacksize;s.st acksize+=stackincrement;}*s.top++=e;returnok;}statuspop(stack&s,elemtype&e){//若栈不空,则删除,用e返回其值,并返回ok;否则返回errorif(s.top==s.base)returnerror;e=*--s.top;returnok;}statusgettop(stack&s){//若栈不空,用e返回s的栈顶元素,并返回ok;否则返回errorif(s.top==s.base)returnerror;return*(s.top-1);}operate.h:#include\statusin(charc){//辨别c与否为运算符if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')returnok;elsereturnerror;}statusoper ate(inta,charc,intb){//二元运算switch(c){case'+':returna+b;break;case'-':returna-b;break;case'*':returna*b;break;case'/':if(b==0){printf(\(提示信息:存有除数为零错误)\\n\);returnerror;}//除数无法为零elsereturna/b;break;}}charprecede(chara,charb){//波函数间优先关系switch(a){case'+':switch(b){case'+':return'>';break;case'-':return'>';break;case'*':return'';break;case'#':return'>';break;}break;case'-':switch(b){case'+':return'>';break;case'-':return'>';break;case'*':return'';break;case'#':return'>';break;}break;case'*':switch(b){case'+':return'>';break;case'-':return'>';break;case'*':return'>';break;case'/':return'>';break;case'(':return'';break;case'#':return'>';break;}break;case'/':switch(b){case'+':return'>'; break;case'-':return'>';break;case'*':return'>';break;case'/':return'>';break;case'(':return'';break;case'#':return'>';break;}break;case'(':switch(b){case'+':return'';b reak;case'-':return'>';break;case'*':return'>';break;case'/':return'>';break;case')':return'>';break;case'#':return'>';break;}break;case'#':switch(b)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

软件技术基础实验报告实验名称:表达式计算器系别:通信工程年级:班级:学生学号:学生姓名:1《数据结构》课程设计报告题目简易计算表达式的演示【题目要求】要求:实现基本表达式计算的功能输入:数学表达式,表达式由整数和“+”、“-”、“×”、“/”、“(”、“)”组成输出:表达式的值基本操作:键入表达式,开始计算,计算过程和结果记录在文档中难点:括号的处理、乘除的优先级高于加减1.前言在计算机中,算术表达式由常量、变量、运算符和括号组成。

由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。

因而在程序设计时,借助栈实现。

算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。

为简化,规定操作数只能为正整数,操作符为+、-*、/、=,用#表示结束。

算法输出:表达式运算结果。

算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。

在读入表达式的字符序列23的同时,完成运算符和运算数的识别处理,以及相应运算。

2.概要设计2.1 数据结构设计任何一个表达式都是由操作符,运算符和界限符组成的。

我们分别用顺序栈来寄存表达式的操作数和运算符。

栈是限定于紧仅在表尾进行插入或删除操作的线性表。

顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top 指示栈顶元素在顺序栈中的位置,base 为栈底指针,在顺序栈中,它始终指向栈底,即top=base 可作为栈空的标记,每当插入新的栈顶元素时,指针top 增1,删除栈顶元素时,指针top 减1。

2.2 算法设计为了实现算符优先算法。

可以使用两个工作栈。

一个称为OPTR ,用以寄存运算符,另一个称做OPND ,用以寄存操作数或运算结果。

1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素;2.依次读入表达式,若是操作符即进OPND 栈,若是运算符则和OPTR 栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR 栈的栈顶元素和当前读入的字符均为”#”)。

2.3 ADT 描述 ADT Stack{ 数据对象:D={ia |i a∈ElemSet,i=1,2,…,n, n ≧0}数据对象:R1={<1,-i i a a >|1-i a ,D a i ∈,i=2,…,n}约定na 端为栈顶,ia 端为栈底。

基本操作:InitStack(&S)操作结果:构造一个空栈S 。

GetTop(S)初始条件:栈S 已存在。

操作结果:用P返回S的栈顶元素。

Push(&S,ch)初始条件:栈S已存在。

操作结果:插入元素ch为新的栈顶元素。

Pop(&S)初始条件:栈S已存在。

操作结果:删除S的栈顶元素。

In(ch)操作结果:判断字符是否是运算符,运算符即返回1。

Precede(c1, c2)初始条件:c1,c2为运算符。

操作结果:判断运算符优先权,返回优先权高的。

Operate(a,op,b)初始条件:a,b为整数,op为运算符。

操作结果:a与b进行运算,op为运算符,返回其值。

num(n)操作结果:返回操作数的长度。

EvalExpr()初始条件:输入表达式合法。

操作结果:返回表达式的最终结果。

}ADT Stack2.4 功能模块分析1.栈的基本功能。

InitStack(Stack *s) 和InitStack2(Stack2 *s)分别构造运算符栈与构造操作数栈,Push(Stack *s,char ch) 运算符栈插入ch为新的栈顶元素,Push2(Stack2 *s,int ch) 操作数栈插入ch为新的栈顶元素,Pop(Stack *s) 删除运算符栈s的栈顶元素,用p返回其值,Pop2(Stack2 *s)删除操作数栈s的栈顶元素,用p返回其值,GetTop(Stack s)用p返回运算符栈s的栈顶元素,4GetTop2(Stack2 s) 用p返回操作数栈s的栈顶元素。

2.其它功能分析。

(1)In(char ch) 判断字符是否是运算符功能,运算符即返回1,该功能只需简单的一条语句即可实现,return(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#')。

(2) Precede(char c1,char c2) 判断运算符优先权功能,该函数判断运算符c1,c2的优先权,具体优先关系参照表1。

(3) Operate(int a,char op,int b)操作数用对应的运算符进行运算功能。

运算结果直接返回。

(4) num(int n) 求操作数的长度功能,需要用itoa函数把int型转换成字符串型,strlen函数可求字符长度。

(5) EvalExpr()主要操作函数运算功能。

分析详细见“3.详细设计…3.2”。

3.详细设计3.1 数据存储结构设计因为表达式是由操作符,运算符和界限符组成的。

如果只用一个char类型栈,不能满足2位以上的整数,所以还需要定义一个int类型的栈用来寄存操作数。

/* 定义字符类型栈*/struct stacklifei1 //数字栈的定义{double *base;double *top;}s1;/struct stacklifei2 //运算符栈的定义{char *base;char *top;}s2;3.2 计算功能的实现void jisuan() // 该函数对数字栈的前两个栈顶5//元素与符号栈的栈顶元素完成一次运算操作{double a,b;b=*(s1.top-1);s1.top--;if(s1.top==s1.base){error=1;return ;}a=*(s1.top-1);switch(*(s2.top-1)){case '+':a=a+b;break;case '-':a=a-b;break;case '*':a=a*b;break;case '/':if(b==0){error=2;s2.top=s2.base;return ;}//除数不为0else a=a/b;break;default :error=1;}fprintf(file,"%lf %c %lf= %lf\n",*(s1.top-1),*(s2.top-1),b,a);*(s1.top-1)=a; //将运算结果入栈s2.top--;return ;}3.3函数表达式求值功能的实现void qiuzhi(char *cr)该函数完成对表达式的处理{6int i=0,k,h,flag,fuhao=0;double sum,j;s1.base=s1.top=shuzhi;s2.base=s2.top=fuha;*(s2.top)='#';s2.top++;while(s2.top!=s2.base){sum=0;flag=0;k=10;j=1;h=1;while(cr[i]>='0'&&cr[i]<='9'||cr[i]=='.')//若当前的字符是数字,就将char型的数据转换为double型{if(cr[i]=='.'){if(cr[i-1]<'0'||cr[i-1]>'9'||i==0||cr[i+1]<'0'||cr[i+1]>'9'){error=1;break;}else{k=1;h=10;}}else{flag=1;j=j*h;sum=sum*k+(cr[i]-48)/j;}i++;}3.4对函数表达式每个字符的操作7switch(cr[i]){case '-':if(cr[i-1]=='('||i==0){fuhao=1;i++;break;}//判断是不是负号,若不是则进行与加号相同的操作//当'-'出现在表达式第一位或是'('后第一位,则应将其判为负号case '+'://加、减号的优先级只比'('和'='高,若栈顶元素为这两者之一//就将其入栈,否则执行运算操作if(*(s2.top-1)=='('||*(s2.top-1)=='#'){*(s2.top)=cr[i];s2.top++;i++;}else jisuan();break;case '*':case '/'://乘、除号的优先级只比'*'、'/'和'^'低,若栈顶元素为这三者之一//就执行运算操作,否则将其入栈if(*(s2.top-1)=='*'||*(s2.top-1)=='/')jisuan();else{*(s2.top)=cr[i];s2.top++;i++;}break;case '(': *(s2.top)=cr[i]; s2.top++;i++;break;//未入栈时'('的优先级最高,所以它一定要入栈8//但一入栈其优先级就应降为最低case ')'://注意:由于'()'运算优先级最高故我直接进行运算,//直到栈顶元素为'('后将'('出栈,故符号栈中一定没有')',//这也是我进行以上优先级判断的前提if(*(s2.top-1)=='('){s2.top--;i++;}else jisuan();break;case '='://表达式结束,若符号栈栈顶元素不为'#',进行运算//否则退栈,结束if(*(s2.top-1)=='#'){s2.top--;}else jisuan();break;default :i++; //清除空格及未定义符号}3.5主菜单页面的实现void main(){char cr[60];char c='a';file=fopen(outfile,"w+");//使用提示printf("****************************************************************** *************\n");9printf("*********************************李斐计算器************************************\n");printf("四则简易计算器\n\n");printf("输入表达式例如2+4= \n\n");printf("最后按# 键则会退出保存\n\n");printf("谢谢使用\n\n");printf("------------------------------------------------------------------------------\n");printf("****************************************************************** ************\n");//循环输入表达式,按'#'键退出while(c!='#'){error=0;printf("输入表达式:\n");gets(cr);fprintf(file,"表达式:%s\n",cr);qiuzhi(cr);printf("任意键继续,按# 键退出:\n");c=getch();}fclose(file);}【附加一】算符间的优先关系如下:( < < < < < = > > ) > > > > = > > > = < < < < < < = < # < < < < < < > =4.软件测试1.运行成功后界面。

相关文档
最新文档