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

合集下载

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

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

竭诚为您提供优质文档/双击可除数据结构表达式求值实验报告篇一:数据结构实验二——算术表达式求值实验报告《数据结构与数据库》实验报告实验题目算术表达式求值学院:化学与材料科学学院专业班级: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!二、概要设计拟采用两种类型的展分别对操作数和操作符进行操作。

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

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

实验报告课程名:数据结构(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.表达式求值运行结果。

数据结构课程设计-表达式求值【完整版】

数据结构课程设计-表达式求值【完整版】

XXXXXX大学《数据结构》课程设计报告班级:学号:姓名:指导老师:目录一算术表达式求值一、需求分析二、程序得主要功能三、程序运行平台四、数据结构五、算法及时间复杂度六、测试用例七、程序源代码二感想体会与总结算术表达式求值一、需求分析一个算术表达式就是由操作数(operand)、运算符(operator)与界限符(delimiter)组成得。

假设操作数就是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号与表达式起始、结束符“#”,如:#(7+15)*(23—28/4)#。

引入表达式起始、结束符就是为了方便.编程利用“算符优先法”求算术表达式得值.二、程序得主要功能(1)从键盘读入一个合法得算术表达式,输出正确得结果。

(2)显示输入序列与栈得变化过程。

三、程序运行平台Visual C++6、0版本四、数据结构本程序得数据结构为栈。

(1)运算符栈部分:struct SqStack //定义栈{char *base; //栈底指针char *top; //栈顶指针intstacksize; //栈得长度};intInitStack (SqStack &s) //建立一个空栈S{if (!(s、base= (char *)malloc(50*sizeof(char))))exit(0);s、top=s、base;s、stacksize=50;return OK;}char GetTop(SqStack s,char &e) //运算符取栈顶元素{if (s、top==s、base) //栈为空得时候返回ERROR{ﻩ printf("运算符栈为空!\n");ﻩ return ERROR;}elsee=*(s、top-1); //栈不为空得时候用e做返回值,返回S得栈顶元素,并返回OK returnOK;}int Push(SqStack&s,char e) //运算符入栈{if (s、top—s、base >= s、stacksize)ﻩ{printf("运算符栈满!\n");ﻩs、base=(char*)realloc(s、base,(s、stacksize+5)*sizeof(char));//栈满得时候,追加5个存储空间if(!s、base)exit (OVERFLOW);s、top=s、base+s、stacksize;s、stacksize+=5;}ﻩ*(s、top)++=e;//把e入栈ﻩreturn OK;}int Pop(SqStack &s,char &e) //运算符出栈{if (s、top==s、base) //栈为空栈得时候,返回ERROR{printf("运算符栈为空!\n”);ﻩ return ERROR;}else{ﻩﻩe=*-—s、top;//栈不为空得时候用e做返回值,删除S得栈顶元素,并返回OK return OK;}}int StackTraverse(SqStack&s)//运算符栈得遍历{ﻩchar *t;ﻩt=s、base;ﻩif (s、top==s、base){ﻩ printf(”运算符栈为空!\n”); //栈为空栈得时候返回ERRORreturn ERROR;}while(t!=s、top){ﻩﻩprintf(" %c",*t); //栈不为空得时候依次取出栈内元素t++;ﻩ}return ERROR;}(2)数字栈部分:struct SqStackn//定义数栈{int *base; //栈底指针int*top; //栈顶指针int stacksize; //栈得长度};intInitStackn (SqStackn &s) //建立一个空栈S{s、base=(int*)malloc(50*sizeof(int));if(!s、base)exit(OVERFLOW);//存储分配失败s、top=s、base;s、stacksize=50;return OK;}int GetTopn(SqStackn s,int&e) //数栈取栈顶元素{if(s、top==s、base){printf("运算数栈为空!\n");//栈为空得时候返回ERRORﻩ return ERROR;}elseﻩe=*(s、top-1);//栈不为空得时候,用e作返回值,返回S得栈顶元素,并返回OKreturnOK;}int Pushn(SqStackn &s,int e) //数栈入栈{if(s、top—s、base>=s、stacksize){ﻩﻩprintf("运算数栈满!\n");//栈满得时候,追加5个存储空间ﻩs、base=(int*)realloc (s、base,(s、stacksize+5)*sizeof(int));if(!s、base) exit (OVERFLOW);ﻩs、top=s、base+s、stacksize;//插入元素e为新得栈顶元素s、stacksize+=5;}*(s、top)++=e; //栈顶指针变化returnOK;}int Popn(SqStackn &s,int &e)//数栈出栈{ﻩif (s、top==s、base){ﻩ printf("运算符栈为空!\n");//栈为空栈得视时候,返回ERRORﻩ return ERROR;ﻩ}else{ﻩﻩe=*—-s、top;//栈不空得时候,则删除S得栈顶元素,用e返回其值,并返回OK ﻩreturnOK;}}int StackTraversen(SqStackn &s)//数栈遍历{ﻩint*t;ﻩt=s、base ;ﻩif(s、top==s、base)ﻩ{printf("运算数栈为空!\n”);//栈为空栈得时候返回ERRORﻩ return ERROR;ﻩ}ﻩwhile(t!=s、top)ﻩ{printf(” %d”,*t); //栈不为空得时候依次输出t++;}return ERROR;}五、算法及时间复杂度1、算法:建立两个不同类型得空栈,先把一个‘#’压入运算符栈。

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

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

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

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

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

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

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

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

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

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

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

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

- - 1.前言12.概要设计12.1 数据构造设计12.2 算法设计12.3 ADT描述22.4 功能模块分析23.详细设计33.1 数据存储构造设计33.2主要算法流程图〔或算法伪代码〕44.软件测试75.心得体会8参考文献8附录9- -优质-..1.前言在计算机中,算术表达式由常量、变量、运算符和括号组成。

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

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

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

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

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

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

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

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

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

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

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

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

可以使用两个工作栈。

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

1.首先置操作数栈为空栈,表达式起始符〞#〞为运算符栈的栈底元素;2.依次读入表达式,假设是操作符即进OPND栈,假设是运算符那么和OPTR栈的栈顶运算符比拟优先权后作相应的操作,直至整个表达式求值完毕〔即OPTR栈的栈顶元素和当前读入的字符均为〞. .word.zl.数据构造课程设计第 2 页#〞〕。

表达式求值实验报告

表达式求值实验报告

表达式求值实验报告西南大学数据结构实验报告学院:专业:班级:姓名:学号:实验报告一、实验题目:表达式表达式二、实验目的和建议:目的:(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)。

《数据结构课程设计》表达式求值实验报告

《数据结构课程设计》表达式求值实验报告

实验课程名称专业班级学生姓名学号指导教师20 至 20 学年第学期第至周算术表达式求值演示一、概述数据结构课程设计.要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面.加深对课程基本内容的理解。

同时.在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

在这次的课程设计中我选择的题目是算术表达式求值演示。

表达式计算是实现程序设计语言的基本问题之一.也是栈的应用的一个典型例子。

设计一个程序.演示用算符优先法对算术表达式求值的过程。

深入了解栈和队列的特性.以便在解决实际问题中灵活运用它们.同时加深对这种结构的理解和认识。

二、系统分析1.以字符列的形式从终端输入语法正确的、不含变量的整数表达式。

利用已知的算符优先关系.实现对算术四则混合运算表达式的求值.并仿照教科书的例子在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。

2.一般来说.计算机解决一个具体问题时.需要经过几个步骤:首先要从具体问题抽象出一个适当的数学模型.然后设计一个解决此数学模型的算法.最后编出程序.进行测试.调试直至得到想要的答案。

对于算术表达式这个程序.主要利用栈.把运算的先后步骤进行分析并实现简单的运算!为实现算符优先算法.可以使用两个栈.一个用以寄存运算符.另一个用以寄存操作数和运算结果。

3.演示程序是以用户于计算机的对话方式执行.这需要一个模块来完成使用者与计算机语言的转化。

4.程序执行时的命令:本程序为了使用具体.采用菜单式的方式来完成程序的演示.几乎不用输入什么特殊的命令.只需按提示输入表达式即可。

(要注意输入时格式.否者可能会引起一些错误)5. 测试数据。

三、概要设计一个算术表达式中除了括号、界限符外.还包括运算数据和运算符。

由于运算符有优先级别之差.所以一个表达式的运算不可能总是从左至右的循序执行。

每次操作的数据或运算符都是最近输入的.这与栈的特性相吻合.故本课程设计借助栈来实现按运算符的优先级完成表达式的求值计算。

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

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

数据结构表达式求值实验报告数据结构表达式求值实验报告⒈引言本实验旨在研究和实现数据结构中表达式求值的算法。

表达式求值是计算机科学中常见的问题,对于计算机程序的正确性和性能具有重要影响。

本报告将详细介绍实验设计、实验步骤、实验结果及分析,并对实验过程中遇到的问题进行讨论。

⒉实验设计⑴实验目的本实验的目的是实现一个可以对常见的算术表达式进行求值的算法,包括支持基本的加减乘除运算符和括号。

⑵实验环境●操作系统:Windows 10●开发语言:C++●开发工具:Visual Studio 2019⑶数据结构设计为了实现表达式求值的算法,我们需要设计适当的数据结构来存储和处理表达式。

本实验中,我们选择使用栈来实现表达式求值。

●表达式栈:用于存储操作数和运算符。

●运算符栈:用于存储运算符。

⑷算法设计表达式求值的算法可以分为以下几个步骤:●遍历表达式,逐个处理操作数和运算符:●如果是操作数,入表达式栈。

●如果是运算符,与运算符栈栈顶元素进行比较,根据优先级决定如何处理。

●当表达式遍历完成后,依次处理剩余的运算符。

●最终表达式栈中的元素即为求值结果。

⒊实验步骤⑴数据结构实现根据设计,我们首先实现表达式栈和运算符栈的数据结构,包括入栈、出栈等操作。

⑵表达式输入与预处理用户输入待求值的表达式,进行预处理,去除空格、验证表达式的合法性等。

⑶表达式求值算法实现根据前述的算法设计,实现表达式求值的算法,利用表达式栈和运算符栈来处理表达式。

⑷测试与结果分析对于不同的测试用例,进行表达式求值的测试,并分析结果的正确性和性能。

⒋实验结果与分析经过实验测试,我们得到了表达式求值的结果。

结果显示,我们的算法能够正确地求得表达式的值,而且性能良好。

⒌讨论与总结在实验过程中,我们遇到了一些问题,并进行了讨论和解决。

通过这个实验,我们更加深入地理解了表达式求值的算法,并对数据结构的应用有了更清晰的认识。

附件:无法律名词及注释:●无。

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

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

数据结构实验二——算术表达式求值实验报告算术表达式求值实验报告一、引言算术表达式求值是计算机科学中一个重要的基础问题,它涉及到了数据结构和算法的应用。

本实验旨在通过实现一个算术表达式求值的程序,加深对数据结构中栈的理解和应用,并掌握算术表达式的求值过程。

二、实验目的1. 理解算术表达式的基本概念和求值过程;2. 掌握栈的基本操作和应用;3. 实现一个能够正确求解算术表达式的程序;4. 进一步熟悉编程语言的使用。

三、实验内容1. 设计并实现一个栈的数据结构;2. 实现算术表达式求值的算法;3. 编写测试用例,验证程序的正确性;4. 进行性能测试,分析算法的时间复杂度。

四、实验方法与步骤1. 设计栈的数据结构在本实验中,我们选择使用数组来实现栈的数据结构。

栈的基本操作包括入栈(push)、出栈(pop)、判断栈空(isEmpty)和获取栈顶元素(top)等。

2. 算术表达式求值算法算术表达式求值的一种常用算法是通过后缀表达式进行求值。

具体步骤如下: - 将中缀表达式转换为后缀表达式;- 通过栈来求解后缀表达式;- 返回最终的计算结果。

3. 编写测试用例编写一系列测试用例,包括不同类型的算术表达式,以验证程序的正确性。

例如:- 简单的四则运算表达式:2 + 3 * 4 - 5;- 包含括号的表达式:(2 + 3) * (4 - 5);- 包含多位数的表达式:12 + 34 * 56;- 包含浮点数的表达式:3.14 + 2.71828。

4. 性能测试和时间复杂度分析针对不同规模的输入数据,进行性能测试,记录程序的运行时间。

同时,分析算法的时间复杂度,验证算法的效率。

五、实验结果与分析我们设计并实现了一个栈的数据结构,并成功地完成了算术表达式求值的程序。

通过对一系列测试用例的验证,我们发现程序能够正确地求解各种类型的算术表达式,并返回正确的计算结果。

在性能测试中,我们对不同规模的输入数据进行了测试,并记录了程序的运行时间。

算术表达式求值实验报告

算术表达式求值实验报告

算术表达式求值实验报告1. 背景算术表达式求值是计算机科学中的基本问题之一,涉及到对数学表达式的解析和计算。

在计算机编程中,经常需要对用户输入的数学表达式进行求值,以得到正确的计算结果。

因此,研究如何高效地求解算术表达式是非常重要的。

在本次实验中,我们将探索不同方法来求解算术表达式,并比较它们的性能和准确性。

我们将使用Python语言作为实现工具,并通过编写代码来实现不同方法。

2. 分析2.1 表达式解析在进行表达式求值之前,我们首先需要对输入的数学表达式进行解析。

解析过程主要包括以下几个步骤:1.去除空格:将输入的字符串中的空格字符去除。

2.分词:将字符串按照运算符和操作数进行分割,得到一个由标记组成的列表。

3.构建语法树:根据分词结果构建一个语法树,用于表示数学表达式的结构。

4.求值:通过遍历语法树并执行相应操作,最终得到表达式的值。

2.2 求值方法在本次实验中,我们将尝试以下两种不同的求值方法:1.递归求值:通过递归地遍历语法树来求解表达式。

递归求值的优点是简单易懂,但可能存在性能问题。

2.栈求值:使用栈数据结构来辅助求解表达式。

栈可以有效地处理运算符的优先级和括号的匹配问题。

2.3 性能评估为了评估不同方法的性能,我们将使用一组测试用例来对其进行比较。

测试用例包括不同长度和复杂度的数学表达式,以及各种运算符和括号的组合。

我们将使用Python内置的time模块来测量每种方法的执行时间,并比较它们之间的差异。

此外,我们还将检查每种方法是否能正确地计算出表达式的结果。

3. 实验结果3.1 表达式解析在实现表达式解析过程时,我们首先去除输入字符串中的空格,并将其转换为一个字符列表。

然后,我们使用递归下降法来构建语法树。

具体而言,我们定义了以下几个函数:1.parse_expression(tokens):该函数接受一个标记列表作为参数,并返回一个表示整个表达式的语法树。

2.parse_term(tokens):该函数接受一个标记列表作为参数,并返回一个表示项的语法树。

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

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

数据结构实训总结报告题目:表达式求值学生姓名:学生学号:专业班级:指导老师:目录1.课题分析 .....................................................................1.1需求分析..............................................................1. 2设计要求............................................................2.总体设计.......................................................................2.1主程序的流程.....................................................3.详细设计(步骤及代码实现) ...................................3. 1判断运算符优先级..............................................3. 2中缀表达式转后缀表达式..................................3. 3后缀表达式求值.................................................. 4.测试结果 .................................................................... 5.心得体会 .................................................................... 6.参考文献 ....................................................................1.课题分析1.1需求分析(1)栈“后进先出”的特点。

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

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

实验二表达式求值
实验内容:
用算符优先法设计一个具有加、减、乘、除四功能的计算程序。

实验目的与要求:
掌握栈的数据结构和基本操作。

实验原理:
1.表达式是由操作数,运算符和界限符组成。

2.实现算符优先算法,实用两个工作栈。

一个叫OPTR,用以寄存运算符;一个叫OPND,用以寄存操作数或运算结果。

3.算法的基本思路:
(1)首先置操作数栈为空栈,表达式起始符#作为运算符栈的栈底元素;
(2) 依次读入表达式中的每个字符,通过运算符判断函数In()使操作数进OPND 栈;
(3)通过函数Precede()将运算符与OPTR栈的栈底运算符比较出优先权,若栈顶元素优先权低则输入下个操作数到OPND,若两优先权相等,脱号并接受下一个字符,若栈顶元素优先高,退栈并将运算结果(通过函数Operate()运算)入栈。

循环上述操作直到表达式求值结束。

(4)返回运算结果。

4.所用的函数及作用:
InitStack():构造一个空栈
Push():插入元素进栈
GetTop():返回栈顶元素
Precede():运算符优先权进行判断
Pop():元素出栈
Operate():运算操作数
5. 测试结果与分析
上述程序在Visual C++ 6.0环境下加以实现。

经过多次测试,程序运行正确。

运行结果。

如图所示:
6. 收获与体会
通过这次课程设计:
1.我又进一步巩固了C语言的基础,尤其是栈。

2.算法中需要建很多的函数,队提高了自己的编程能力有帮助,
3.程序不够简洁,还有待改进,功能还有待更完善。

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

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

实验3 利用栈实现算术表达式求值一、实验目的1、帮助读者复习C语言程序设计中的知识。

2、熟悉栈的逻辑结构。

3、了解算术表达式计算的逻辑过程。

4、熟悉算术表达式计算过程中优先级的运算方法。

5、了解中缀表达式和后缀表达式的区别。

二、实验内容[问题描述]1.实验目标:利用栈的特性,实现算术表达式的运算,了解算术运算的逻辑,掌握栈的特性。

2.中缀表达式与后缀表达式的含义中缀表达式就是通常所说的算术表达式,比如(1+2)*3-4。

后缀表达式是指通过解析后,运算符在运算数之后的表达式,比如上式解析成后缀表达式就是12+3*4-。

这种表达式可以直接利用栈来求解。

[基本要求](1)利用栈实现后缀表达式的计算;(2)利用栈实现中缀表达式到后缀表达式的转换。

(可选)基于程序易于设计的考虑,我们仅需要实现一位数值(0-9)的+,-,*,/,()等运算。

三、设计思路四、源代码#include<stdio.h>#include<string.h>#include<stdlib.h>#define max 100typedef struct{float data[max];int top;}seqstack;void InitStack(seqstack *s);int StackEmpty(seqstack *s);int StackFull(seqstack *s);void Push(seqstack *s,char x);int Pop(seqstack *s);float ComputeExpress(char a[]);void main(){char a[max],b[max];float f;printf("请输入一个后缀表达式:\n");gets(a);printf("后缀表达式为:%s\n",a);f=ComputeExpress(b);printf("计算结果为:%f\n",f);}void InitStack(seqstack *s){s->top=-1;}int StackEmpty(seqstack *s){return s->top==-1;}int StackFull(seqstack *s){return s->top==max-1;}void Push(seqstack *s,char x){if(StackFull(s))printf("overflow");s->data[++s->top]=x;}int Pop(seqstack *s){if(StackEmpty(s))printf("underflow");return s->data[s->top--];}float ComputeExpress(char a[]){seqstack s;int i=0;float x1,x2,value;float result;s.top=-1;while(a[i]!='\0'){if(a[i]!=' '&&a[i]>='0'&&a[i]<='9'){value=0;while(a[i]!=' '){value=10*value+a[i]-'0';i++;}s.top++;s.data[s.top]=value;}else{switch(a[i]){case'+':x1=s.data[s.top];s.top--;x2=s.data[s.top];s.top--;result=x1+x2;s.top++;s.data[s.top]=result;break;case'-':x1=s.data[s.top];s.top--;x2=s.data[s.top];s.top--;result=x2-x1;s.top++;s.data[s.top]=result;break;case'*':x1=s.data[s.top];s.top--;x2=s.data[s.top];s.top--;result=x1*x2;s.top++;s.data[s.top]=result;break;case'/':x1=s.data[s.top];s.top--;x2=s.data[s.top];s.top--;result=x2/x1;s.top++;s.data[s.top]=result;break;}i++;}}if(s.top!=-1)result=s.data[s.top];s.top--;if(s.top==-1)return result;else{printf("表达式错误");exit(-1);}}五、测试结果六、心得体会这次实验我只做了利用栈实现后缀表达式的计算熟悉栈的逻辑结构,同时了解算术表达式计算的逻辑过程。

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

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

算法的正确性和效率分析
正确性
所有实现的数据结构都正确地实现了算术表达式求值的功能,没有出现计算错 误的情况。
效率
在处理大量数据时,使用堆栈(Stack)和队列(Queue)的数据结构表现最 佳。堆栈在处理后缀表达式时效率最高,而队列在处理中缀表达式时效率最高 。
数据结构优化的效果评估
使用哈希表(Hash Table)
展望未来,希望能够进一步研究算术 表达式求值算法的优化和改进,提高 计算效率和精度。
THANKS
感谢观看
05
列表(List)
数组(Array) 元组(Tuple) 集合(Set)
字典( Dictiona…
由于列表在Python中是动 态数组,其性能在处理大 量数据时相对较差。在算 术表达式求值中,列表的 平均执行时间最长。
使用NumPy库的数组结构 ,其性能在处理大量数据 时优于列表。但在算术表 达式求值中,其性能仍然 不如其他数据结构。
03
了解如何使用栈数据结构实现括号匹配和回退机制 。
掌握数据结构在算术表达式求值中的应用
01 熟悉使用数组、链表等基本数据结构存储和操作 算术表达式。
02 掌握如何使用树形数据结构表示算术表达式,如 二叉树或表达式树。
03 了解动态规划在优化算术表达式求值中的运用。
提高编程能力和解决问题的能力
01
在处理重复元素时,使用哈希表可以显著提高数据结构的效率。在算术表达式求值中,哈希表的使用可以减少重 复计算和查找的时间。
预处理输入数据
对输入的算术表达式进行预处理,如括号消除、指数化等,也可以提高数据结构的效率。预处理可以减少运算的 复杂度和时间。
05
实验总结
本次实验的收获和体会

表达式求值 实验报告

表达式求值 实验报告

表达式求值实验报告表达式求值实验报告一、引言表达式求值是计算机科学中一个重要的概念,它涉及到对数学表达式的计算和求解。

在本次实验中,我们将探讨表达式求值的相关算法和实现方法,并通过编程实现一个简单的表达式求值器。

二、算法原理1. 表达式的表示方法在计算机中,我们通常使用字符串来表示表达式。

例如,一个简单的数学表达式"2 + 3 * 4"可以表示为字符串"2+3*4"。

在实现表达式求值的算法时,我们需要将字符串中的数字和运算符进行分离,以便进行后续的计算。

2. 中缀表达式转后缀表达式为了方便计算,我们通常将中缀表达式转换为后缀表达式。

后缀表达式也称为逆波兰表达式,它的特点是运算符位于操作数的后面。

例如,上述的中缀表达式"2+3*4"可以转换为后缀表达式"234*+"。

转换的方法可以通过使用栈来实现。

3. 后缀表达式求值得到后缀表达式后,我们可以通过扫描表达式并使用栈来求解。

当遇到操作数时,将其压入栈中;当遇到运算符时,从栈中弹出相应数量的操作数进行计算,并将结果压入栈中。

最终,栈中的唯一元素即为表达式的求值结果。

三、实验过程1. 数据结构设计为了实现表达式求值器,我们需要设计相应的数据结构。

在本次实验中,我们选择使用栈来存储操作数和运算符。

2. 中缀表达式转后缀表达式首先,我们需要编写一个函数来将中缀表达式转换为后缀表达式。

该函数的实现可以通过使用栈和遍历字符串来实现。

具体的步骤如下:- 创建一个空栈和一个空字符串用于存储后缀表达式。

- 从左到右遍历中缀表达式的每个字符。

- 如果遇到操作数,直接将其添加到后缀表达式字符串中。

- 如果遇到运算符,将其与栈顶的运算符进行比较:- 如果栈为空或栈顶为左括号"(",则直接将运算符入栈。

- 如果栈顶的运算符优先级低于当前运算符,则将当前运算符入栈。

- 如果栈顶的运算符优先级高于或等于当前运算符,则将栈顶的运算符弹出并添加到后缀表达式字符串中,直到栈顶的运算符优先级低于当前运算符或栈为空。

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

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

数据结构表达式求值实验报告一、实验目的本次实验的主要目的是通过实现表达式求值的程序,深入理解数据结构和算法在解决实际问题中的应用。

具体包括掌握栈这种数据结构的操作和使用,熟悉表达式的转换和计算过程,提高编程能力和问题解决能力。

二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。

三、实验原理表达式求值是程序设计中的一个常见问题,通常采用栈这种数据结构来实现。

表达式可以分为中缀表达式、后缀表达式和前缀表达式。

中缀表达式是我们日常使用的表达式形式,如“2 +3 4”,但直接对中缀表达式求值比较复杂。

而后缀表达式(如“2 3 4 +”)和前缀表达式(如“+2 3 4”)求值相对简单。

因此,在实现表达式求值时,通常先将中缀表达式转换为后缀表达式,然后对后缀表达式进行求值。

转换过程中,使用两个栈,一个用于存储操作数,另一个用于存储运算符。

求值过程中,根据后缀表达式的特点,从左到右依次处理操作数和运算符,进行相应的计算。

四、实验步骤1、定义数据结构定义栈类,用于存储操作数和运算符。

定义一个结构体来表示操作数和运算符。

2、中缀表达式转后缀表达式从左到右扫描中缀表达式。

遇到操作数,直接输出。

遇到运算符,根据其优先级与栈顶运算符的优先级进行比较,决定入栈或出栈操作。

3、后缀表达式求值从左到右扫描后缀表达式。

遇到操作数,入栈。

遇到运算符,从栈中取出两个操作数进行计算,将结果入栈。

4、主函数输入中缀表达式。

调用转换函数和求值函数,输出计算结果。

五、实验代码```cppinclude <iostream>include <stack>include <string>//定义操作符的优先级int priority(char op) {if (op =='+'|| op =='')return 1;if (op ==''|| op =='/')return 2;return 0;}//中缀表达式转后缀表达式std::string infixToPostfix(std::string infix) {std::stack<char> opStack;std::string postfix ="";for (char c : infix) {if (isdigit(c)){postfix += c;} else if (c =='('){} else if (c ==')'){while (!opStackempty()&& opStacktop()!='('){postfix += opStacktop();opStackpop();}opStackpop();//弹出'('} else {while (!opStackempty()&& priority(opStacktop())>=priority(c)){postfix += opStacktop();opStackpop();}opStackpush(c);}}while (!opStackempty()){postfix += opStacktop();}return postfix;}//后缀表达式求值int evaluatePostfix(std::string postfix) {std::stack<int> operandStack;for (char c : postfix) {if (isdigit(c)){operandStackpush(c '0');} else {int operand2 = operandStacktop();operandStackpop();int operand1 = operandStacktop();operandStackpop();switch (c) {case '+':operandStackpush(operand1 + operand2);break;case '':operandStackpush(operand1 operand2);break;case '':operandStackpush(operand1 operand2);break;case '/':operandStackpush(operand1 / operand2);break;}}}return operandStacktop();}int main(){std::string infixExpression;std::cout <<"请输入中缀表达式: ";std::cin >> infixExpression;std::string postfixExpression = infixToPostfix(infixExpression);int result = evaluatePostfix(postfixExpression);std::cout <<"表达式的计算结果为: "<< result << std::endl;return 0;}```六、实验结果输入不同的中缀表达式,如“2 +3 4”“( 2 + 3 )4”等,程序能够正确地将其转换为后缀表达式,并计算出结果。

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

数据结构表达式求值完整篇(含实验报告)
1.栈的定义、初始化、出栈进栈、取栈顶元素等步骤不难就先把结构打好了
2.操作数和运算符分别入不同的栈
char->int 进操作数栈
先考虑了小于10的整数直接进栈,重点是运算符的优先级这块函数的编写
3前面的都听简单的,就是小数编写这块想了很久,
将单个字符转为整数后还要定一个double p;使依次输入的数成一个小数->p.
}
//操作数栈初始化
void OPND_InitStack(Sqstack_OPND &s)
{
s.base=new SElemType_OPND[MAXSIZE];
if(!s.base)
printf("\n操作数栈存储分配失败!\n");
s.top=s.base;
s.stacksize=MAXSIZE;
if(ch != '.' )
{
if ( dimo != '.' )
{
p = p*10 ;
p += (ch-'0');
scanf("%c",&ch);
}
else if ( dimo == '.')
{
p = p+(ch-'0')*q;
q=q*q;;
scanf("%c",&ch#39;.' )
}
//操作数入栈
void OPND_Push(Sqstack_OPND &s,SElemType_OPND e)
{
if(s.top-s.base == s.stacksize)
printf("\n满栈!\n");

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

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

竭诚为您提供优质文档/双击可除数据结构表达式求值实验报告篇一:数据结构实验二——算术表达式求值实验报告《数据结构与数据库》实验报告实验题目算术表达式求值学院:化学与材料科学学院专业班级: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!二、概要设计拟采用两种类型的展分别对操作数和操作符进行操作。

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

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

实验报告课程名称:数据结构与算法课程类型:必修实验项目名称:线性表及应用实验题目:表达式中缀转后缀并求值班级:0903301学号:17姓名:李清掌握线性表的使用,能用栈将中缀表达式转换成后缀表达式并求值。

二、实验要求及实验环境实验要求:1、使用栈来进行操作2、能输出后缀表达式3、正确求出表达式的值并输出该值实验环境:NetBeans IDE / win 7系统三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系,自己扩展内容的等)主要数据类型:queue <char> A 存储原来算术表达式stack <char> B存储转换成的后缀表达式stack <char> B1 临时存储后缀表达式(B)stack <char> C 表达式转化过程使用的过度栈,存储操作符stack <int> S 存储数字(包括输入和计算过程中的数)char ch,QQint d1,d2,d3Transition函数流程图:Value函数的流程图:文档收集自网络,仅用于个人学习注:在value 函数中还可以判定除数是否为0,为0则输出"0 can'tbe a divisor!",并终止程序。

四、测试结果B 弹栈判断数字字符运算符求出其数值并存入S 栈中从S 栈中取出栈顶的两个数,进行相应的运算,并把结果存入S 中B 空返回S 的栈顶元素判断B 不空由测试结果可知,基本完成了实验要求。

五、系统不足与经验体会1、该程序只能运算整数,也不能处理输入的负数2、不能处理非法输入3、几种线性表(队列、栈、数组、链表)从根本上说可以实现同一个功能,只是难易程度的问题,熟悉各线性表的特点有助于快速选择简单的方法。

4、第一次实验,代码比较乱,可能有些重复的地方六、附录:源代码(带注释)#include<iostream>#include <string>#include <stack>#include <queue>using namespace std;void transition(queue <char> &A, stack <char> &B) //将中缀表达式转换成后缀表达式{stack <char> C; //表达式转化过程使用的过度栈char ch;while(!()){ch = (); ();if(ch >= '0' && ch <= '9') //判断数字{(ch); //压栈while(!() && () >= '0' && () <= '9'){()); //其它位依次入栈至该数字结束();}(' '); //用空格表示一个数字的结束}else if(ch == '(') (ch) ;//判断为左括号else if(ch == ')') //判断为右括号,把上一个左括号之前的所有操作符弹出存入B中,再弹出左括号{while () != '('){());();}();}else if(ch == '+' || ch == '-')//判断为加减号,把上一个左括号之前的所有操作符弹出存入B中,再把+,-存入C中{while(!() && () != '('){());();}(ch);}else if (ch == '*' || ch == '/') //判断为乘除号,弹出前面紧邻的*,/,再把这个*或/存入C中{while() == '*' || () == '/'){());();}(ch);}}while (!())//将C栈中所有运算符依次弹出存入B栈中{());();}//下面是将B倒序while(!()){());();}while(!()){());();}return ;}int value(stack <char> &B) //后缀表达式求值{int d1,d2,d3;stack <int> S;char ch;while(!()){ch = ();();if(ch >= '0'&&ch <= '9')//将数字字符转换成数字 {d1 = 0;while(ch != ' '){d1 = 10*d1 + ch - '0';//求出一个数字的数值 ch = (); ();}(d1);}else{d2 = (); ();d3 = (); ();switch(ch) //运算符操作{case'+':( d3+d2 );break;case'-':( d3-d2 );break;case'*':( d3*d2 );break;case'/':if(d2 != 0){( d3/d2 );}else //0不能做除数{cout << "0 can't be a divisor!" << endl;exit(0);}break;}}}return ();}int main(){char QQ;queue <char> A; //存储原来算术表达式stack <char> B,B1; //存储转换成的后缀表达式 cout << "Please input your expession:" << endl; while( QQ != '\n'){QQ = getchar();(QQ);};transition(A,B);//前缀表达式转换成后缀表达式cout << "The pofix expession is:" << endl;while(!()){cout << ();());();//将B栈数据转移到B1}cout << endl ;while(!())//数据返还给B{());();}cout << "Value:" << endl << value(B) << endl; return 0;}。

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

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

数据结构表达式求值实验报告关键信息项:1、实验目的:____________________________2、实验环境:____________________________3、实验原理:____________________________4、实验步骤:____________________________5、测试用例及结果:____________________________6、实验总结:____________________________11 实验目的本实验的主要目的是通过使用数据结构和算法来实现表达式求值的功能,加深对栈、队列等数据结构的理解和运用,提高编程能力和解决实际问题的能力。

111 具体目标包括掌握中缀表达式转换为后缀表达式的方法。

利用栈结构实现后缀表达式的求值运算。

能够处理表达式中的运算符优先级和括号。

12 实验环境本次实验使用的编程环境为具体编程语言和版本,在操作系统名称操作系统上进行。

121 所需软件和工具编程软件名称:用于编写和调试代码。

测试工具名称:用于对程序进行测试和验证。

13 实验原理表达式求值是程序设计中的一个常见问题。

中缀表达式符合人们的日常书写习惯,但直接求值较为复杂。

将中缀表达式转换为后缀表达式后,求值过程会变得更加简单和直观。

131 中缀转后缀表达式的原理遇到操作数,直接输出。

遇到运算符,将其与栈顶运算符进行优先级比较。

若优先级高于栈顶运算符,则入栈;否则,弹出栈顶运算符并输出,直到当前运算符优先级高于栈顶运算符或栈为空,然后将当前运算符入栈。

遇到左括号,直接入栈。

遇到右括号,弹出栈顶运算符并输出,直到遇到左括号,左括号出栈但不输出。

132 后缀表达式求值的原理从左到右扫描后缀表达式。

遇到操作数,压入栈中。

遇到运算符,从栈中弹出两个操作数,进行相应运算,将结果压入栈中。

扫描结束后,栈顶元素即为表达式的结果。

14 实验步骤141 数据结构设计定义一个栈来存储运算符。

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

//用e返回栈顶元素
float Push(SqStack *S,float e) //插入e为新的栈顶元素(运 算数) { if(S->top-S->base>=S->stacksize) { S->base=(float*)realloc(S->base,(S>stacksize+STACKINCREMENT)*sizeof(float)); S->top=S->base+S->stacksize; S->stacksize+=STACKINCREMENT; } *S->top++=e; return e; } char push(sqStack *S,char e) //插入e为新的栈顶元素(运 算符) { if(S->top-S->base>=S->stacksize)
void jiancha2(char e) //判断e是否为合法的运算符或运 算数 SElemType Precede(char g, char h) //优先权比较 float Operate(float s,char yunsuanfu,float t) //返回二元运 算结果
三、实验结果
Hale Waihona Puke 测试表达式及对应运行结果 1、 “3+6#” 结果为9
4、编程实现平台
Microsoft Visual C++ 6.0
二、设计思路及采取方案
1、设计思路:
为了实现算符优先法,可以使用两个工作栈。一个称做OPTR,用以 寄存运算符;另一个称做OPND,用以寄存操作数或运算结果。 算法的基本思想是:
(1)首先置操作数栈为空栈,表达式起始符“#”作为运算符栈的栈底 元素; (2)依次读入表达式中每个字符,若是操作数则进入OPND栈,若是运 算符则和OPTR栈的栈顶运算符比较优先权后作相应操作,直至整个表达 式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为“#”)。 算法中还调用了两个函数。其中函数Precede是判定运算符栈顶运算 符与读入的运算符之间优先关系的函数;函数Operate为进行二元运算 的函数,如果是编译表达式,则产生这个运算的一组相应指令并返回存 放结果的中间变量名;如果是解释执行表达式,则直接进行该运算,并 返回运算结果。
算数) { float e; if(S->top==S->base) return ERROR; e=*(S->top-1); return e; } char getTop(sqStack *S) (运算符) { char e; if(S->top==S->base) return ERROR; e=*(S->top-1); return e; }
五、参考文献
【1】严蔚敏,吴伟民. 数据结构(C语言版). 北京:清华大学出版社,2007 【2】李春葆. 数据结构教程(第3版)上机实验指导. 北京:清华大学出版社,2009 【3】谭浩强. C程序设计(第四版).北京:清华大学出版社
六、附录
C语言程序代码及部分注释 #include<stdio.h> #include<stdlib.h> #define ERROR 0;
#define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 int flag=0; //flag标记输入字符是否合法 typedef struct { float *base; float *top; int stacksize; }SqStack; typedef struct { char *base; char *top; int stacksize; }sqStack;
return 1; else return 0;
} void jiancha2(char e) //判断e是否为合法的运算符或运 算数 { if(e==48||e==49||e==50||e==51||e==52||e==53||e==54||e==55||e==56||e flag=1; else if(e=='+'||e==''||e=='*'||e=='/'||e=='('||e==')'||e=='#') flag=1; else flag=0; } char Precede(char p,char q) //优先级比较函数 { switch(p) { case'+':if((q=='*')||(q=='/')||(q=='(')) return'<';else return '>';break; case'-':if((q=='*')||(q=='/')||(q=='(')) return'<';else return '>';break; case'*':if(q=='(') return '<'; else return '>';break; case'/':if(q=='(') return '<'; else return '>';break; case'(':if(q==')') return '='; else if(q=='#') return ' '; else return '<';break; case')':if(q=='(') return ' '; else return '>';break; case'#':if(q=='#') return '='; else if(q==')') return ' '; else return '<';break; default: printf("你的输入非法\n"); } } float Operate(float s,char yunsuanfu,float t) //二元运算操
初始条件:a, b为整数,OP为运算符。 操作结果:a与b进行运算,OP为二元运算符,返回其值。 }ADT Stack (2)符号之间的优先权关系比较 <:的优先权低于: =:的优先权等于 >:的优先权高于 + + * / ( ) # > > > > < > < > > > > < > < * < < > > < > < / < < > > < > < < ( < < < < < ) > > > > = > > = # > > > >
(20
课程设计报告 -20 学年 第 学期)
报告题目:算术表达式求值 课程名称: 数据结构 任课教员: 专 业: 学 号: 姓 名:
二0一



摘要:现代科学技术高速发展,各种高科技产品频频问世,而各种技术 的基础都离不开基本的表达式求值,它虽然简单,但却是任何复杂系统 的基本执行操作。栈是一种重要的线性结构,从数据结构的角度看,它
2、方案设计
(1)抽象数据类型定义 ADT Stack{ 数据对象:D={ | ∈ElemSet,i=1,2,…,n,, n≧0} 数据对象:R1={<, > | , ∈D,i=2,…,n} 约定端为栈顶,端为栈底。 基本操作: InitStack(&S) 操作结果:构造一个空栈S。 GetTop(S) 初始条件:栈S已存在。 操作结果:用P返回S的栈顶元素。 Push(&S, e) 初始条件:栈S已存在。 操作结果:插入元素e为新的栈顶元素。 Pop(&S, e) 初始条件:栈S已存在。 操作结果:删除S的栈顶元素,并用e返回其值。 Precede(,) 初始条件:,为运算符。 操作结果:判断运算符优先权,返回表示优先权高低关系 的“<”、“=”或“>”的字符。 Operate(a, OP, b)
(3)顺序栈的定义 typedef struct { SElemType *base; SElemType *top; int stacksize; }SqStack; (4)调用函数: void InitStack(SqStack *S) //构造空栈 SElemType GetTop(SqStack *S) //用e返回栈顶 元素 SElemType Push(SqStack *S, SElemType e) //插入e为新的 栈顶元素 SElemType Pop(SqStack *S) //删除栈顶元素 int jiancha1(char e) //判断e是运算符还是运算数
2、 “(7-5)*3#”
结果为6
3、 “8/4#”
结果为2.
四、心得体会
1、算符优先法是教材上有关栈的应用的一个具体实例,考虑到算符
优先法中对于运算符的操作是先入先出的,正好符合栈这种结构的存储 使用规则,于是我们便可以利用栈来实现算法 2、由于教材上给出的存储结构定义、函数等都是伪码,不是可执行 的程序代码,故需要从程序语言(C语言)角度考虑,将伪码转换成程 序代码。而这是不是一个简单的工作。编写程序的过程需要非常的小心 仔细,任何一个细小的错误,都会导致程序的运行失败。在写好程序第 一次编译时,我的程序出现了将近80条错误,经过两天的检查、调试以 及和同学的讨论,我的程序才最终通过编译,成功运行。比如在定义字 符常量时,#define STACK_INIT_SIZE 100和 #define STACKINCREMENT 10这两个语句的句末是不能加分号的,这 个问题我花了两个多小时才发现。 3、经过自己动手编写这个有关栈的程序,我发现自己对栈的理解更 加完全、更加深刻了。对于栈的逻辑结构、存储结构、操作函数、应用 以及具体实现,我有一种豁然开朗的感觉。 4、此算法只能进行个位数的加减乘除运算,对两位及以上数不能操 作,。因此算符优先法对算术表达式求值存在很大的局限性。若要完善 算术表达式求值,应该完善算法,或者换用其它算法来实现。
相关文档
最新文档