算术表达式求值.

算术表达式求值.
算术表达式求值.

算术表达式求值演示

一、需求分析

(1)输入的形式:语法正确的、不含变量的字符序列形式的整数表达式

输入值的范围:整数的范围是-(215-l)~(215-1)

运算符:+,-,*,/,(,)

表达式结束运算符 #

(2)输出的形式:范围是-(215-l)~(215-1)的整数

(3)程序所能达到的功能:实现对算术四则混合运算表达式的求值;

程序执行命令包括:

1) Calculate ——计算表达式的值

2) Exit ——退出

(4)测试数据

1) 8

2) 2-2-2-3;

3) 4+26/12-2*7;

4) 18-3*7-15/6;

5) 2*(6+2*(3+6*(6+6)));

演示程序以用户与计算机交互方式执行,即在计算机终端上显示"提示信息"之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据(滤去输入中的非法字符)和运算结果显示在其后。

二、概要设计

(1)为实现上述程序功能需要的抽象数据类型:

1) 栈的抽象数据类型:

ADT Stack{

数据对象:D={ |ai|ai∈elems et, i=1,2, …,n,n≥0 }

数据关系:R1={| ai-1,ai∈D, i=2,…,n }

基本操作:

InitStack()

操作结果:构造一个空栈。

GetTop(S,&e)

初始条件:栈S已存在且非空。

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

Push(&S,e)

初始条件:栈S已存在。

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

Pop(&S,&e)

初始条件:栈S已存在且非空。

操作结果:删除S的栈顶元素,并且用e返回其值。

}ADT Stack

2) 系统中子程序及功能要求:

Precede(char c1,char c2):比较两个字符的优先级,并返回比较结果。

Operate(SElemType a,char op,SElemType b):函数进行四则运算,并返回运算结果。

judge(char op):判断是否为运算符。

EvaluateExpression():进行四则混合运算,并返回运算结果。

(2) 本次程序设计中一共有三个模块,一个是由主函数构成的模块,一个是由各个子功能函数构成的栈模块,第三个是由运算等函数构成的运算模块。

(3) 主模块可以对子模块中的函数进行调用,但子模块不能对主模块中的内容进行调用;子模块中的函数可相互调用。具体函数调用关系如下:

main 调用 EvaluateExpression()

EvaluateExpression() 调用Precede、Operate、judge、InitStack()、GetTop、 Push、Pop。

三、详细设计

(1) 程序流程图:

(2)

typedef int Status;

typedef int SElemType; //元素类型

typedef struct

{

SElemType *base;

SElemType *top;

int stacksize;

}SqStack; //结点类型和指针类型

(3) 栈的基本操作定义如下:

Status InitStack(SqStack *S);

//构造一个空栈S

Status GetTop(SqStack S)

//若栈不空,则返回栈顶元素,否则返回ERROR

Status Push(SqStack *S,SElemType e);

//插入e为新的栈顶元素

Status Pop(SqStack *S,SElemType *e);

//若栈不空,则删除S的栈顶元素,用e返回其值,返回OK,否则返回ERROR

(4) 系统中子程序的基本操作定义:

Char Precede(char c1,char c2);

//进行运算符的优先级比较,并返回比较结果。

SElemType Operate(SElemType a,char op,SElemType b);

//进行两个整数数的四则运算,并返回运算结果。

Status judge(char op)

//判断是否为运算符。

SElemType EvaluateExpression()

//进行四则混合运算,并返回运算结果。

(5) 部分基本操作的源程序如下:

Status Push(SqStack *S,SElemType e)

{

*(S->top)++=e;

return OK; //插入元素e为新的栈顶元素

}

Status Pop(SqStack *S,SElemType *e)

{

if(S->top==S->base)

return ERROR; //若栈为空,返回ERROR

*e=*(--(S->top));

return OK; //栈不为空,删除S的栈顶元素,用e返回其值,并返回OK }

char Precede(char a,char b)

{//根据课本P53,表3-1算符间优先关系编写程序实现算符间的优先级比较 SElemType r;

switch(a)

{

case'+':

case'-': //’+’,’-’运算符优先级相同,故放在一起进行比较 if(b=='*'||b=='/'||b=='(')r='<';

else r='>';

break;

case'*': //’*’,’/’运算符优先级相同,故放在一起进行比较 case'/':

if(b=='(') r='<';

else r='>';

break;

case'(':

if(b=='#')

{

printf("\nLogic expression error!There is no right bracket!");

return(‘0’) ; //逻辑错误,只有左括号,缺少右括号 }

else {

if(b==')')r='=';

else r='<';

}

break;

case')':

if(b=='(')

{

printf("\nMatching errors in brackets! ");

return(‘0’) ; //括号匹配错误

}

else r='>';

break;

case'#':

if(b==')')

{

printf("\nLogic expression error!There is no left bracket!");

return(‘0’) ; //逻辑错误,只有右括号,缺少左括号 }

else

{

if(b=='#')r='=';

else r='<';

}

break;

}

return(r);

}

SElemType Operate(SElemType a,char op,SElemType b)

{ //进行算数运算 op为运算符

switch(op)

case'+':return(a+b);break;

case'-':return(a-b);break;

case'*':return(a*b);break;

case'/':

if(b!=0) return(a/b);

else

{

printf("\n0 can not do Divisor");

return(‘0’) ;

}

}

}

SElemType EvaluateExpression()

{

SqStack OPTR,OPND;

SElemType a,b,e,sum,theta,x;

char c; //声明各个变量

sum=0; //初始化

InitStack(&OPTR); //创建运算符栈

Push(&OPTR,('#'-'0')); //’#’所对的整型量进运算符栈 InitStack(&OPND); //创建操作数栈

c=getchar();

while(c!='#'||GetTop(OPTR)!=('#'-'0'))

{

if(!judge(c))

while(c>='0'&&c<='9')

{

sum=(sum*10+(c-'0'));

c=getchar();

}

Push(&OPND,sum); //不是运算符进栈

sum=0;

}

else

switch(Precede((GetTop(OPTR)+'0'),c))

{

case'<': //栈顶元素优先级低

Push(&OPTR,(c-'0'));c=getchar();break;

case'=': //托括号并接受下一个字符

Pop(&OPTR,&x);c=getchar();break;

case'>': //栈顶元素优先级高,退栈并将运算结果进栈

Pop(&OPTR,&theta);

Pop(&OPND,&b);

Pop(&OPND,&a);

e=Operate(a,(theta+'0'),b);

Push(&OPND,e);

break;

case'0':Push(&OPND,0);c='#'; //逻辑错误,0进栈,并结束运算 break;

}

}

return (GetTop(OPND));

}

四、调试分析

(1) 在调试过程中遇到的两大问题:

1)如何进行超过一位的数的存储

原因分析:按照预想的想法,对表达式进行实际操作时发现,当输入超过一

位的数时,在程序的运行过程中,只进行了数的最低位的运算:

例如1+15#,由于系统将15进行两个字符处理后仍按两个字符进

行进栈存储,使得实际运行结果为6,显然是错误的

解决方案:对操作数的进栈存储程序进行优化,使其能将多位数视为单个字

符进行进栈存储

具体程序由原来的if(!judge(c))

{

Push(&OPND,sum);

c=getchar();

}

优化如下:

if(!judge(c))

{

while(c>='0'&&c<='9')

{

sum=(sum*10+(c-'0'));

c=getchar();

}

Push(&OPND,sum);sum=0;

}

当然,在声明变量时已经对sum进行了初始化:sum=0。

2) 如何进行数的转换

原因分析:最初对站内元素类型的定义为char,但进行运算时发现其运算

或则是运算的结果均不能超过128,这是由char类型本身的性

决定的

解决方案:将栈内元素的类型定义为int,无论是运算符,还是数字字符,在

进栈之前都进行(-‘0’)操作,对于已经整型化的数字字符在进

行其后的运算或进栈时不用在进行数的转换,但是由于个人程序的

编制要求,运算符在出栈时仍需要进行相关的操作(+‘0’),即将

运算符重新字符化

(2) 实验总结:

经过本次课程设计,我深刻地感受到数据结构的重要性,《数据结构》是计算机专业很重要的一门课程,也是必须要熟练掌握的课程。

本次课程设计,我选择的项目是算术表达式的求值,它的实现主要是栈的应用,所以,通过这次的实习,特别加深了我对栈这一数据类型的理解,在实际应用中也比以前更加得心应手。另外,在本次的程序设计中,我还切身的体会到不同的类型的数据的实际意义,一个程序可能会因为元素类型定义不当而永远得不到预期得结果。在本次课程设计当中,在做完需求分析和概要设计后,我又进行了详细设计,经过一番分析之后,我首先对自己需要的模块进行了详细的编写,在确保各个功能模块的可行性以及正确性后,进行了与主函数、函数与函数之间的连接,调试后又进行了数据测试,并对结果进行分析,并做了多次改进和调试。在调试的过程中,我深刻的认识到,对于计算机专业的学生来说,应更好的掌握应用软件的分析方法和调试方法,应该能够熟练运用高级语言的程序调试器DEBUG调试程序。

经过这次课程设计,我真的学到了很多东西,一方面巩固和加深了我对数据结构这门课程的理解,在实际应用方面也较以前有了很大的进步。在设计的过程难免会遇到很多问题,此时千万不要气馁,解决问题的方法可以有很多,可以通过网络、书籍等方法进行需求信息的查找,寻求他人帮助自然也是一个好办法,但我个人觉得更多的应该是自己独立思考,才能达到提升自己分析问题、解决问题的能力作用。

此次课程设计将我们所学的理论知识和实际运用进行了一次很好的连接,有利于加强我们用理论知识来分析实际问题的能力,进而加强了我们对知识认识的实践度,巩固了我们的理论知识,深化了对知识的认识,并为走向社会打下一个良好的基础。

当然在这次课程设计中除了程序本身的问题外,我也发现了很多别的问题,发现自己的数据结构基础还不是很扎实,还有很多需要改进和努力的地方,在今后的学习中,我一定会努力地去巩固我的基础知识,并在实践中加强应用。

在这次课程设计中我遇到不少问题和麻烦,在老师们和同学们的帮助和提示下,才能够如此顺利地完成了设计,在次对老师们表示真诚的感谢!

五、用户使用说明

(1) 进入程序运行界面后,出现欢迎语并显示执行命令项

(2) 用户按程序提示进行命令项的选择

(3) 按提示要求输入待运算的表达式(必须输入合法的,不含变量并且以#结束的表达

式)

(4) 系统输出运算结果,并重复(1)~(3)的操作,需要退出时,可在(2)中进行选择

六、测试结果

(1)输入:8#

输出: The value of expression:8

运行结果截图为

(2)输入:2-2-2-3#

输出:The value of expression:-5

运行结果截图为

(3)输入:4+26/12-2*7#

输出:The value of expression:-8 运行结果截图为

(4)输入:18-3*7-15/6#

输出:The value of expression:-5

运行结果截图为

(5)输入:2*(6+2*(3+6*(6+6)))#

输出:The value of expression:312 运行结果截图为

七、附录

源代码

#include

#include

#define STACK_INIT_SIZE 100 /*栈的存储空间初始分配量*/

#define MAX 100 /*字符存储空间分配量*/

#define TURE 1

#define ERROR 0

#define OK 1

#define FALSE 0

#define OVERFLOW -2

typedef int SElemType; /*元素类型*/

typedef int Status;

typedef struct{

SElemType *base; /*在构造之前和销毁之后,base的值为NULL*/

SElemType *top; /*栈顶指针*/

int stacksize; /*当前已分配的存储空间,以元素为单位*/ }SqStack; /*结点类型和指针类型*/

Status InitStack(SqStack *S) /*构造一个空栈S*/

{

S->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));

if(!(S->base))exit(OVERFLOW); /*存储空间分配失败*/

S->top=S->base;

S->stacksize=STACK_INIT_SIZE;

return OK;

}

Status GetTop(SqStack S)

{

if(S.top>S.base)

{

return(*(S.top-1)); /*栈不为空,返回栈顶元素*/

}

else

return ERROR; /*栈为空,返回ERROR*/

}

Status Push(SqStack *S,SElemType e) /*插入元素e*/

{

*(S->top)++=e;

return OK; /*插入成功,返回OK*/

}

Status Pop(SqStack *S,SElemType *e) /*删除栈顶元素,并用e返回*/

{

if(S->top==S->base)

return ERROR; /*栈为空,返回ERROR*/

*e=*(--(S->top));

return OK; /*栈不为空,删除栈顶元素,返回OK*/ }

表达式求值算法实现

湖南人文科技学院计算机科学技术系 课程设计说明书 课程名称:数据结构 课程代码:408024 题目: 表达式求值 年级/专业/班:08级计算机科学与技术二班 学生姓名: 黄胜李业芝黄自强 黄沅涛姚洋 学号:08408210 08408211 08408212

08408213 08408215 指导教师: 袁辉勇 开题时间: 2009 年12 月21 日 完成时间: 2010 年 1 月 1 日

目录 摘要 (1) 一、引言 (3) 二、设计目的与任务 (3) 1、课程设计目的 (3) 2、课程设计的任务 (4) 三、设计方案 (4) 1、需求分析 (4) 2、概要设计 (4) 3、详细设计 (6) 4、程序清单 (13) 四、调试分析与体会 (17) 五、运行结果 (18) 六、结论 (20) 七、致谢 (21) 八、参考文献 (21)

摘要 在高级语言环境中算术表达上的结果是通过语言环境预设的算法的思想计算出来的,然而高级语言初学者并不了解表达式的计算过程和方法。本文采用算符优先分析和堆栈的方法给出了算术表达式的计算过程。 所以本次课程设计的程序是在Windows系统上为用户解决包括加、减、乘、除以及括号在内的四则混合运算。用户可通过键盘输入四则运算,经过程序运行之后,可以判断出用户所输入的表达式是否正确。如果正确,就给出表达式的值;如果不正确,就提示输入有误。 关键词:四则混合运算;高级语言;栈 Abstract The arithmetic expression result is the algorithm thought which supposes in advance through the language environment calculatesin the higher order language environment,however the higher order language beginner does not understand the expression the computationprocess and the method. This article used the operator first to analyze and the storehouse method has given the arithmetic expression computa-tion process. Therefore, the procedure in this curriculum design is the solution for users on Windows systems, including add, subtract, multiply, divide and brackets, including four hybrid operation. Users can enter via the keyboard 4 operation, after a program is running, you can determine the user entered expression is correct. If correct, it gives the value of the expression; if not correct, it prompted an error.

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

竭诚为您提供优质文档/双击可除数据结构表达式求值实验报告 篇一:数据结构实验二——算术表达式求值实验报告 《数据结构与数据库》 实验报告 实验题目算术表达式求值 学院:化学与材料科学学院 专业班级:09级材料科学与工程系pb0920603 姓学 邮名:李维谷号:pb09206285箱: liwg@https://www.360docs.net/doc/da11033814.html,指导教师:贾伯琪 实验时间:20XX年10月10日 一、需要分析 问题描述: 表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。

问题分析: 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。 在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。 算法规定: 输入形式:一个(:数据结构表达式求值实验报告)算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。 输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。 程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。 测试数据:正确输入:12*(3.6/3+4^2-1)#

数据结构课程设计_表达式求值问题

实验表达式求值问题 1.问题描述 表达式是数据运算的基本形式。人们的书写习惯是中缀式,如:11+22*(7-4)/3.中缀式的计算按运算符的优先级及括号优先的原则,相同级别从左到右进行计算。表达式还有后缀表达式(如:11 22 7 4 - * 3 / +)和前缀表达式(+ 11 / * 22 - 7 4 3)。后缀表达式 和前缀表达式中没有括号,给计算带来方便。如后缀表达式计算时按运算符出现的先后进行计算。本设计的主要任务是进行表达式形式的转换及不同形式的表达式计算。 2.数据结构设计 (1)顺序栈类定义:首先应在类中定义成员函数,以此来完成顺序栈的相关操作,如下: class SqStack { private: T *base; //栈底指针 int top; //栈顶 int stacksize; //栈容量public: SqStack(int m); //构建函数 ~SqStack(){delete [] base;top=0;stacksize=0;} //析构函数 void Push(T x); //入栈 T Pop(); //出栈 T GetTop(); //获取栈顶元素

int StackEmpty(); //测栈空 void ClearStack(); //清空栈 void StackTop(); //返回栈顶指针 void StackTranverse(); //显示栈中元素 }; (2)顺序栈类实现:对顺序栈进行初始化,初始化的首要操作就是创建一个空顺序栈。 Step1:申请一组连续的存空间为顺序栈使用: base=new T[m]; i f(base==NULL) { cout<<"栈创建失败,退出!"<

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

《数据结构与数据库》 实验报告 实验题目 算术表达式求值 学院:化学与材料科学学院 专业班级:09级材料科学与工程系PB0920603 姓名:李维谷 学号:PB09206285 邮箱:liwg@https://www.360docs.net/doc/da11033814.html, 指导教师:贾伯琪 实验时间:2010年10月10日 一、需要分析 问题描述:

表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。 问题分析: 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。 在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。 算法规定: 输入形式:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。 输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。 程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。 测试数据:正确输入:12*(3.6/3+4^2-1)# 输出结果:194.4

算术表达式求值演示程序

数理学院 课程设计报告书 课程名称数据结构课程设计 设计题目算术表达式求值演示 专业班级 学号 姓名 指导教师

2014 年12 月

4.2.2 基本操作: 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 Stack 主程序的流程:

EvaluateExpression() 函数实现了对表达式求值的功能,main() 函数直接调用EvaluateExpression() 对输入的表达式求值输出。 4.2.3 函数的调用关系图

4.3 详细设计 4.3.1 ① . Precede(char c1,char c2)判断运算符优先权,返回优先权高的 算符间的优先关系 如下: 算法伪代码如下: char Precede(char c1,char c2) { static char array[49]={ >', '>', '<', '<', '<', '>', '>', >', '>', '<', '<', '<', '>', '>', >', '>', '>', '>', '<', '>', '>', >', '>', '>', '>', '<', '>', '>', <', '<', '<', '<', '<', '=', '!', >', '>', '>', '>', '!', '>', '>', <', '<', '<', '<', '<', '!', '='}; // 用一维数组存储 49 种情况 switch(c1) { /* i 为下面 array 的横标 */ case '+' : i=0;break; case '-' : i=1;break; case '*' : i=2;break;

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

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

1.前言 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为简化,规定操作数只能为正整数,操作符为+、-*、/、=,用#表示结束。 算法输出:表达式运算结果。 算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。 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={ i a |i a ∈ElemSet,i=1,2,…,n, n ≧0} 数据对象:R1={< 1 ,-i i a a >| 1-i a ,D a i ∈,i=2,…,n}

后缀表达式求值的算法及代码

#include #include struct node // 栈结构声明 { int data; // 数据域 struct node *next; // 指针域 }; typedef struct node stacklist; // 链表类型 typedef stacklist *link; // 链表指针类型 link operand=NULL; // 操作数栈指针 link push(link stack,int value) // 进栈 { link newnode; // 新结点指针 newnode=new stacklist; // 分配新结点 if (!newnode) { printf("分配失败!"); return NULL; } newnode->data=value; // 创建结点的内容 newnode->next=stack; stack=newnode; // 新结点成为栈的开始return stack; } link pop(link stack,int *value) // 出栈 { link top; // 指向栈顶 if (stack !=NULL) { top=stack; // 指向栈顶 stack=stack->next; // 移动栈顶指针 *value=top->data; // 取数据 delete top; // 吸收结点 return stack; // 返回栈顶指针} else *value=-1; } int empty(link stack) // 判栈空 { if (stack!=NULL)

表达式求值课程设计报告

表达式求值课程设计报告 表达式求值 《数据结构》 课程设计报告 题目: 栈的应用:表达式求值 (系): 信息科学与工程学院院 专业班级: 软件工程1102班学生姓名: 学号: 指导教师: 20 13 年 6 月 8 日至20 13 年 6 月 21 日 表达式求值 目录 目录 (2) 1 概述 (1) 1.1 课程设计目的 (1) 1.2 课程设计内容 (1) 2 系统需求分析 ...................................................... 1 2.1 系统目标 (1) 2.2 主体功能 (1) 2.3 开发环境 (1) 3 系统概要设计 .................................................... 2 3.1 系统的功能模块划分 (2)

3.2 系统流程图 (2) 4系统详细设计 ..................................................... 3 5 测试 ............................................................ 6 5.1 测试方案 (6) 5.2 测试结果 (6) 6 小结 ............................................................ 8 参考文献 .......................................................... 9 附录1 源程序清单 (10) 2 数据结构课程设计报告(2012) 表达式求值 1 概述 1.1 课程设计目的 1(要求学生达到熟练掌握C语言的基本知识和技能。 2(了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力。 3(提高程序设计和调试能力。学生通过上机实习,验证自己设计的算法的正确性。学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。 4(培养算法分析能力。分析所设计算法的时间复杂度和空间复杂度,进一步提 高程序设计水平。

基于二叉树结构的表达式求值算法

实验报告 课程名称: 程序设计与数据结构 指导老师: ljq 成绩: 实验名称:基于二叉树结构的表达式求值算法 实验类型: 上机 同组学生姓名: 一、实验目的和要求(必填) 三、代码缺陷及修正记录 五、讨论、心得 二、实验内容和代码(必填) 四、实验结果与分析(必填) 一、实验目的和要求 1. 掌握编程工具的使用 2. 掌握二叉树数据结构在计算机上的实现 3. 掌握通过计算机编程解决问题的基本方法 二、实验内容和代码 1.实验内容: ● 编程实现基于二叉树结构的表达式求值算法 ● 表达式包含加减乘除四则运算以及至少一层括弧运算 ● 首先将输入的原表达式转换成二叉树结构,然后采用二叉树的后序递归遍历 方法求得表达式的值 ● 将所有实验内容合并到一个工程,增加交互操作和循环处理(持续) 2.代码 1.头文件expnbitree .h

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include #include #include #define EXP_LEN 100 //定义表达式的最大长度 #define DATA_LEN 20 //定义每个操作数的最大长度 typedef struct BiTNode { int dflag; //标志域,值为1,data[]存放操作运算符;值为0,data[]存放操作数char data[DATA_LEN + 1]; //数据域,存放:操作运算符或操作数 struct BiTNode *lchild, *rchild; //分别指向结点的左、右子树 }BiTNode, *BiTree; //定义二叉树结点及二叉树类型指针 int CreateBiTree(BiTree &bt, char *p, int len); //创建二叉树,并用bt返回树的根地址,p为表达式的首地址,l为表达式的长度 int Calculate(BiTree bt, double &rst); //计算表达式的值,bt为据表达式创建的二叉树,用rst返回表达式的值 int PreOrderTraverse(BiTree bt);//先序遍历二叉树bt,输出先序遍历序列 int InOrderTraverse(BiTree bt); //中序遍历二叉树bt,输出中序遍历序列 int PostOrderTraverse(BiTree bt); //后序遍历二叉树bt,输出后序遍历序列 int DestroyBiTree(BiTree &bt); //销毁二叉树 //二叉树结构的表达式求解算法入口

算术表达式求值课程设计报告

课程设计 教学院 课程名称 题目 专业 班级 姓名 同组人员 指导教师 2013 年 6 月22 日 (完成时间)

目录 一.概述 (2) 二.总体方案设计 (4) 三.详细设计 (6) 四.程序的调试与运行结果说明 (14) 五.课程设计总结 (14) 六.附录 (16) 参考文献 (3233) (“目录”要求必须自动生成)

一概述(宋体,三号,加粗,居中) 1.课程设计的目的(小标题,宋体,四号,加粗,左对齐顶格) (1).理解和掌握该课程中的有关基本概念,程序设计思想和方法。 (2).培养综合运用所学知识独立完成课题的能力。 (3).培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。 (4).掌握从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。 2.课程设计的要求 算术表达式求值程序实现以下功能: (1)构造一个空栈S,初始条件:栈S已存在 (2)用P返回S的栈顶元素 (3)插入元素ch为新的栈顶元素 (4)删除S的栈顶元素 (5)判断字符是否是运算符,运算符即返回1 (6)判断运算符优先权,返回优先权高的 (7)输入表达式 (8)返回表达式的最终结果。

二总体方案设计 a)需求分析 该程序能实现算术四则运算表达式的求值,显示运算过程。 输入的形式:表达式,例如5*(3+7)#。 包含的运算符只能有'+'、 '-'、'*'、 '/'、 ' (' ') '; 程序所能达到的功能:对表达式求值并输出。 b)总体设计 本程序使用的是编程工具是Visual c++ 6.0,实现了运算器的功能和仿真界面(大体界面如下图所示)。在基本要求的基础上,运算数可以是实数类型,同时增加了乘方运算的功能;可以实现对负数的运算,例如用户输入表达式6* (-0.25),则程序会在负号的前面自动加上一个0。 1)算符包括加(+)、减(-)、乘(*)、除(/)、乘方(^);另一个称作 OPND,用以寄存操作数和运算结果,操作数可以是float型的浮点数。 算法的基本思想是: 2)首先置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素; 依次读入表达式中的每个字符,若是操作数(浮点数)则进OPND栈, 若是运算符(+、—、*、/、^)则和OPTR栈的栈顶运算符比较优先权 后作相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当 前读入的字符均为“#”)。 3)编写一个原型为void strtofloat(char str[ ],int n,int i),把一 个数字串转换为一个实型数,并压入运算数栈中。(整个程序的源代码 见附录,并有具体解释)

数据结构课程设计算术表达式求值计算器.doc

高级语言程序设计 《算术表达式求值》 课程设计报告

算术表达式求值 系统可以实现实现对算术四则混合运算表达式求值,并打印求值过程中运算符栈、操作数栈的变化过程。 第二章系统分析 开始运行时界面如下: 你可以输入一个表达式,按E对其进行求值。

第四章系统实现 #include #include #include #include #define N 100 double numStack[N]={0};//操作数栈 int numTop; char opStack[N];//运算符栈 int opTop; void print_num(double str1[],int n) { int i; printf("\n操作数栈:\n"); for(i=0;i

if(ch=='+'||ch=='-') return 2; if(ch=='*'||ch=='/') return 3; if(ch=='(') return -1; return 0; } double result(double num1,char op,double num2)//计算 { if(op=='+') return num1+num2; if(op=='-') return num1-num2; if(op=='*') return num1*num2; if(op=='/') return num1/num2; return 0; } int compute(char str[]) { double num=0; int i=0,j=1,k=1; numTop=opTop=0; while(str[i]!='\0'||opTop>0) { if(str[i]>='0'&&str[i]<='9') num=num*10+str[i]-'0'; else if( k==1&&str[i]=='-'&&(i==0||op(str[i-1])) ) k=-1; else { if(i>0&&!op(str[i-1])&&str[i]!='('&&str[i-1]!=')')

四则运算表达式求值(栈+二叉树,c++版)

HUNAN UNIVERSITY 课程实习报告 题目:四则运算表达式求值 学生姓名:周华毅 学生学号:201308010411 专业班级:计科1304 指导老师:吴帆 完成日期:2015/5/1

一、需求分析 a)四则运算表达式求值,将四则运算表达式用中缀表达式表示,然后转换为后缀表达 式,并计算结果。 b)本程序要求利用二叉树后序遍历来实现表达式的转换,同时可以使用实验2的结 果来求解后缀表达式的值。 c)在字符界面上输入一个中缀表达式,回车表示结束。如果该中缀表达式正确,那么 在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔 开;如果不正确,在字符界面上输出表达式错误提示。 d)测试数据 输入: 21+23*(12-6) 输出: 21 23 12 6 -*+ 二、概要设计 抽象数据类型 为实现上述程序的功能,应以字符串存储用户的输入,以及计算出的结果。 算法的基本思想 根据题目要求,利用二叉树后序遍历来实现表达式的转换。该算法的基本模块包括二叉树的建立以及如何把输入的中缀表达式利用二叉树后序遍历转化为后缀表达式。 1、首先要将输入的中缀表达式(数字字符)存入到二叉树中,由于存在两位或者两位以上的数,甚至还有小数,所以考虑用字符型指针存储数字字符和操作符。 2、为了便于将中缀表达式存入二叉树中,在录入中缀表达式后,要进行相应的处理,比如去掉空格符,添加结束标志,如‘=’、‘#’等。 3、中缀表达式存入到二叉树的过程中,要注意处理的顺序,如‘+’、‘-’号的优先级比‘*’、‘/’号的低,当遇到‘*’、‘/’号时,要判断树以上的节点中是否有‘+’、‘-’号,有的话要与其交换位置。遇到‘(’时要反复创建二叉树的结点,构建子二叉树,考虑到括号内要处理的步骤可能会较多,可以考虑用递归。遇到‘)’时则直接结束此子二叉树的建立。此外二叉树中叶子结点存储操作数,非叶子结点存储操作码。 4、对创建好的二叉树进行后序遍历,即可得到相应的后缀表达式,实现方法可以用递归的方式,由于后面还要计算表达式的值,故便利的过程中要将结点中得到的数据存入新的字符数组中。 程序的流程 程序由三个模块组成: (1)输入模块:完成一个中缀表达式的输入,存入字符串数组array[Max]中。 (2)计算模块:设计一个建立二叉树的函数,Node* crtTree(Node* root),传入根结点指针,返回根结点指针,该函数的实现还要反复使用另一个函数char getOp(Node *temp),其将数字字符存入一个结点,并返回数字字符的后一 个符号。void deal()函数功能是对字符数组进行处理。void output(Node *root); 函数功能是获得处理后的字符串,也就是中缀表达式转化为的后 缀表达式。 (3)输出模块:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式和表达式的值;如果不正确,在字符界面上输出表达式错误提示。 三、详细设计

算术表达式求值课设报告

数据结构课程设计 设计说明书表达式求值算法的实现((()()(( 学生姓名 学号 班级 成绩 指导教师 数学与计算机科学学院 2012年 9月 7日

数据结构课程设计评阅书

课程设计任务书 2011—2012学年第2学期 专业学号:姓名: 课程设计名称:数据结构课程设计 设计题目:表达式求值算法的实现 完成期限:自 2012 年 8 月 28 日至 2012 年 9 月 7 日共 2 周 栈的存储和相关运算是数据结构中数组部分的重点知识和技能。表达式求值算法可借助栈来完成,它的存储可以使用顺序结构也可以使用链式结构,这要根据具体的应用来决定。本课程设计按以下的要求运用C/ C++结构体、指针、数据结构等基知识编程实现。 任务要求:1)阐述设计思想,画出流程图;2)任意输入一个表达式(算术、逻辑、关系表达式);3)建立栈;4)借助栈的相关运算完成表达式求值过程;5)将表达式及其运算结果按照其数学形式打印输出; 6)说明测试方法,写出完整的运行结果,较好的界面设计;7)按照格式要求完成课程设计说明书。设计要求: 1)问题分析和任务定义:根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么?(而不是怎么做?)限制条件是什么?确定问题的输入数据集合。 2)逻辑设计:对问题描述中涉及的操作对象定义相应的数据类型,并按照以数据结构为中心的原则划分模块,定义主程序模块和各抽象数据类型。逻辑设计的结果应写出每个抽象数据类型的定义(包括数据结构的描述和每个基本操作的功能说明),各个主要模块的算法,并画出模块之间的调用关系图; 3)详细设计:定义相应的存储结构并写出各函数的伪码算法。在这个过程中,要综合考虑系统功能,使得系统结构清晰、合理、简单和易于调试,抽象数据类型的实现尽可能做到数据封装,基本操作的规格说明尽可能明确具体。详细设计的结果是对数据结构和基本操作做出进一步的求精,写出数据存储结构的类型定义,写出函数形式的算法框架; 4)程序编码:把详细设计的结果进一步求精为程序设计语言程序。同时加入一些注解和断言,使程序中逻辑概念清楚; 5)程序调试与测试:能够熟练掌握调试工具的各种功能,设计测试数据确保程序正确。调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果; 6)结果分析:程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。算法的时间、空间复杂性分析; 7)编写课程设计报告; 指导教师(签字):教研室主任(签字): 批准日期:年月日

数据结构教学规划表达式求值【完全版】

XXXXXX大学《数据结构》课程设计报告 班级: 学号: 姓名: 指导老师:

目录 一算术表达式求值 一、需求分析 二、程序的主要功能 三、程序运行平台 四、数据结构 五、算法及时间复杂度 六、测试用例 七、程序源代码 二感想体会与总结

算术表达式求值 一、需求分析 一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。编程利用“算符优先法”求算术表达式的值。 二、程序的主要功能 (1)从键盘读入一个合法的算术表达式,输出正确的结果。 (2)显示输入序列和栈的变化过程。 三、程序运行平台 Visual C++ 6.0版本 四、数据结构 本程序的数据结构为栈。 (1)运算符栈部分: struct SqStack //定义栈

{ char *base; //栈底指针 char *top; //栈顶指针 int stacksize; //栈的长度 }; int InitStack (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; } else e=*(s.top-1); //栈不为空的时候用e做返回值,返回S的栈顶元素,并返回OK return OK; } int Push(SqStack &s,char e) //运算符入栈 { if (s.top-s.base >= s.stacksize) { printf("运算符栈满!\n");

《大数据结构》算术表达式求值

实用标准文档 二课程设计2——算术表达式求值 一、需求分析 二、程序的主要功能 三、程序运行平台 四、数据结构 五、算法及时间复杂度 六、测试用例 七、程序源代码 三感想体会与总结 算术表达式求值 一、需求分析 一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。编程利用“算符优先法”求算术表达式的值。 二、程序的主要功能 (1)从键盘读入一个合法的算术表达式,输出正确的结果。 (2)显示输入序列和栈的变化过程。 三、程序运行平台

Visual C++ 6.0版本 四、数据结构 本程序的数据结构为栈。 (1)运算符栈部分: struct SqStack //定义栈 { char *base; //栈底指针 char *top; //栈顶指针 int stacksize; //栈的长度 }; int InitStack (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; } else e=*(s.top-1); //栈不为空的时候用e做返回值,返回S的栈顶元素,并返回OK return OK; }

最新《数据结构》算术表达式求值

二课程设计2——算术表达式求值 一、需求分析 二、程序的主要功能 三、程序运行平台 四、数据结构 五、算法及时间复杂度 六、测试用例 七、程序源代码 三感想体会与总结 算术表达式求值 一、需求分析 一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。编程利用“算符优先法”求算术表达式的值。 二、程序的主要功能 (1)从键盘读入一个合法的算术表达式,输出正确的结果。 (2)显示输入序列和栈的变化过程。 三、程序运行平台 Visual C++ 6.0版本 四、数据结构 本程序的数据结构为栈。 (1)运算符栈部分: struct SqStack //定义栈 { char *base; //栈底指针 char *top; //栈顶指针 int stacksize; //栈的长度 };

int InitStack (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; } else e=*(s.top-1); //栈不为空的时候用e做返回值,返回S的栈顶元素,并返回OK return OK; } 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 {

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

清华大学数据结构课程实验报告(20 -20 学年第学期) 报告题目:算术表达式求值 任课老师: 专业: 学号: 姓名: 二0一年月日

摘要:现代科学技术高速发展,各种高科技产品频频问世,而各种技术的基础都离不开基本的表达式求值,它虽然简单,但却是任何复杂系统的基本执行操作。栈是一种重要的线性结构,从数据结构的角度看,它是一种特殊的线性表,具有先入先出的特点。而算符优先法的设计恰巧符合先入先出的思想。故我们基于栈这种数据结构,利用算符优先法,来实现简单算术表达式的求值。 关键字:算符优先法;算术表达式;数据结构;栈 一、课题概述 1、问题描述 一个算术表达式是由运算数、运算符、界限符组成。假设操作数是正整数,运算符只含有加“+”、减“-”、乘“*”、除“/”四种二元运算符,界限符有左括号“(”、右括号“)”和表达式起始、结束符“#”。利用算符优先法对算术表达式求值。 2、设计目的 (1)通过该算法的设计思想,熟悉栈的特点和应用方法; (2)通过对算符优先法对算术表达式求值的算法执行过程的演示,理解在执行相应栈的操作时的变化过程。 (3)通过程序设计,进一步熟悉栈的基本运算函数; (4)通过自己动手实现算法,加强从伪码算法到C语言程序的实现能力。3、基本要求: (1)使用栈的顺序存储表示方式; (2)使用算符优先法; (3)用C语言实现; (4)从键盘输入一个符合要求的算术表达式,输出正确的结果。 4、编程实现平台 Microsoft Visual C++ 6.0 二、设计思路及采取方案 1、设计思路: 为了实现算符优先法,可以使用两个工作栈。一个称做OPTR,用以寄存运

c语言实现一.二叉树操作 二.用栈实现算术表达式求值 课设报告

目录 题目一.二叉树操作(1)二.算术表达式求 (1) 一、课程设计的目的 (1) 二、课程设计的内容和要求 (1) 三、题目一设计过程 (2) 四、题目二设计过程 (6) 五、设计总结 (17) 六、参考文献 (18)

题目一.二叉树操作(1)二.算术表达式求 一、课程设计的目的 本学期我们对《数据结构》这门课程进行了学习。这门课程是一门实践性非常强的课程,为了让大家更好地理解与运用所学知识,提高动手能力,我们进行了此次课程设计实习。这次课程设计不但要求学生掌握《数据结构》中的各方面知识,还要求学生具备一定的C语言基础和编程能力。 (1)题目一的目的: 1、掌握二叉树的概念和性质 2、掌握二叉树的存储结构 3、掌握二叉树的基本操作 (2)题目二的目的: 1、掌握栈的顺序存储结构和链式存储结构 2、掌握栈的先进后出的特点 3、掌握栈的基本运算 二、课程设计的内容和要求 (1)题目一的内容和要求: 1、编写已知二叉树的先序、中序序列,恢复此二叉树的程序 2、编写求二叉树深度的程序 (2)题目二的内容和要求: 1、算术表达式由操作数、运算符和界限符组成。操作数是正整数,运算符为 加减乘除,界限符有左右括号和表达式起始 2、将一个表达式的中缀形式转化为相应的后缀形式 3、依据后缀表达式计算表达式的值

三、题目一设计过程 1、题目分析 现已知一棵二叉树的先序遍历序列和中序遍历序列,依次从先序遍历序列中取结点,由先序序列确定根结点(就是第一个字母),每次取出一个结点就与中序遍历的序列进行比较,当相等的时候,中序遍历序列就被分成以该结点为根的二叉树子树,该结点左部分为左子树,右部分为右子树,直到取完先序列里的所有结点,则二叉树构造完毕(树用链式存储结构存储),用递归实现! 由建好的二叉树,先判断这棵树是否为空,若不为空则找数的左子树,统计它的高度,然后找树的右子树,统计它的高度,比较左子树和右子树的高度,然后返回其中大的那个值加一,则求出数的高度。这里用递归实现! 2、算法描述 main ( )(主函数) 先构造一颗二叉树,初始化为空,用来存储所构造的二叉树,并输入一棵树的先序序列和中序序列,并统计这个序列的长度。然后调用实现功能的函数。 void CreateBiTree(BiTree *T,char *pre,char *in,int len)(由先序序列和中序序列构造二叉树) 根据前序遍历的特点, 知前序序列(pre)的首个元素(pre[0])为根(root), 然后在中序序列(in)中查找此根(pre[0]), 根据中序遍历特点, 知在查找到的根(root) 前边的序列为左子树, 后边的序列为右子树。设根前边有n个元素,则又有, 在前序序列中,紧跟着根(root)的n个元素序列(即pre[1...n]) 为左子树, 在后边的为右子树,而构造左子树问题其实跟构造整个二叉树问题一样,只是此时前序序列为pre[1...n]), 中序序列为in[0...n-1], 分别为原序列的子串, 构造右子树同样。这里用递归实现! int Depth(BiTree T)(求树的深度) 当所给的参数T是NULL时,返回0。说明这个树只有一个叶子节点深度为0,当所给的参数不是NULL时,函数调用自己看看这个参数的左分支是不是NULL,

相关文档
最新文档