树和二叉树数据结构实验报告.docx

上传人:b****2 文档编号:2320943 上传时间:2022-10-28 格式:DOCX 页数:27 大小:24.39KB
下载 相关 举报
树和二叉树数据结构实验报告.docx_第1页
第1页 / 共27页
树和二叉树数据结构实验报告.docx_第2页
第2页 / 共27页
树和二叉树数据结构实验报告.docx_第3页
第3页 / 共27页
树和二叉树数据结构实验报告.docx_第4页
第4页 / 共27页
树和二叉树数据结构实验报告.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

树和二叉树数据结构实验报告.docx

《树和二叉树数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《树和二叉树数据结构实验报告.docx(27页珍藏版)》请在冰豆网上搜索。

树和二叉树数据结构实验报告.docx

树和二叉树数据结构实验报告

实习报告

题目:

编写一个实现基于二叉树表示的算术表达式 Expression 操作程序

班级:

姓名:

学号:

完成日期//

一、需求分析

算术表达式 Expression 内可以含有变量(a~z)、常量(0~9)和二元算

术符(+,-,*,/,∧(乘幂))。

实现以下操作:

(1)ReadExpr(E)――以字符序列的形式输入语法正确的前缀表达式并构

造表达式 E。

(2)WriteExpr(E)――用带括号的中缀表达式输出表达式 E。

(3)Assign(V,c)――实现对变量 V 的赋值(V=c),变量的初值为 0。

(4)Value(E)――对算术表达式 E 求值。

(5)CompoundExpr(p,E1,E2)――构造一个新的复合表达式(E1)p(E2)。

二、概要设计

1、数据类型的声明:

在这个课程设计中,采用了链表二叉树的存储结构,以及两个顺序栈的辅

助存储结构

/*头文件以及存储结构*/

#include

#include

#include

#include

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define OVERFLOW 0

typedef int Status;

2、表达式的抽象数据类型定义

ADT Expression{

数据对象 D:

D 是具有数值的常量 C 和没有数值的变量 V;

数据关系:

R={<(V 或者 C)P(V 或者 C)>|V,C∈D, <(V 或者 C)P(V 或者 C)>表

示由运算符 P 结合起来的表达式 E}

基本操作:

Status Input_Expr(&string,flag)

操作结果:

以字符序列的形式输入语法正确的前缀表达式,保存到字

符串 string; 参数 flag 表示输出的提示信息是什么,输入成功返回

OK,否则,返回 ERROR。

void judge_value(&E,&string,i)

初始条件:

树 E 存在,表达式的前缀字符串 string 存在;

操作结果:

判断字符 string[i],如果是'0'-'9'常量之间,二叉树结

点 E 存为整型;否则,存为字符型。

Status ReadExpr(&E,&exprstring)

初始条件:

表达式的前缀形式字符串 exprstring 存在;

操作结果:

以正确的前缀表示式 exprstring 并构造表达式 E,构造成

功,返回 OK,否则返回 ERROR。

Status Pri_Compare(c1,c2)

初始条件:

c1 和 c2 是字符;

操作结果:

如果两个字符是运算符,比较两个运算符的优先级,c1 比

c2 优先,返回 OK,否则返回 ERROR。

void WriteExpr(&E)

初始条件:

表达式 E 存在;

操作条件:

用带括弧的中缀表达式输入表达式 E。

void Assign(&E,V,c,&flag)

初始条件:

表达式 E 存在,flag 为标志是否有赋值过;

操作结果:

实现对表达式 E 中的所有变量 V 的赋值(V=c)。

long Operate(opr1,opr,opr2)

初始条件:

操作数 opr1 和操作数 opr2 以及操作运算符 opr;

操作结果:

运算符运算求值,参数 opr1,opr2 为常量,opr 为运算符,

根据不同的运算符,实现不同的运算,返回运算结果。

Status Check(E)

初始条件:

表达式 E 存在;

操作结果:

检查表达式 E 是否还存在没有赋值的变量,以便求算数表

达式 E 的值。

long Value(E)

初始条件:

表达式 E 存在;

操作结果:

对算术表达式求值,返回求到的结果。

void CompoundExpr(P,&E1,E2)

初始条件:

表达式 E1 和 E2 存在;

操作条件:

构造一个新的复合表达式(E1)P(E2)。

Status Read_Inorder_Expr(&string,&pre_expr)

操作结果:

以表达式的原书写形式输入,表达式的原书写形式字符串

string 变为字符串 pre_expr,后调用 reversal_string()函数反转得

到前缀表达式 pre_expr。

得到正确的前缀表达式返回 OK,否则,返回

ERROR。

void MergeConst(&E)

操作结果:

常数合并操作,合并表达式 E 中所有常数运算。

}ADT Expression

3、整体设计

1、顺序栈的基本操作:

对于栈 SqStack:

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

Status StackEmpty(SqStack S)/* 若栈 S 为空栈,则返回 TRUE,否则返回 FALSE */

Status Push(SqStack *S,SElemType e) /* 插入元素 e 为新的栈顶元素 */

Status Pop(SqStack *S,SElemType *e) /* 若栈不空,则删除 S 的栈顶元素,用 e 返回其

值,并返回 OK;否则返回 ERROR */

Status GetTop(SqStack S,SElemType *e) /* 若栈不空,则用 e 返回 S 的栈顶元素,并返

回 OK;否则返回 ERROR */

对于栈 SqStack1:

Status InitStack1(SqStack1 *S)  /* 构造一个空栈 S */

Status StackEmpty1(SqStack1 S)  /* 若栈 S 为空栈,则返回 TRUE,否则返回 FALSE */

Status Push1(SqStack1 *S,SElemType1 e)  /* 插入元素 e 为新的栈顶元素 */

Status Pop1(SqStack1 *S,SElemType1 *e)  /* 若栈不空,则删除 S 的栈顶元素,用 e 返

回其值,并返回 OK;否则返回 ERROR */

Status GetTop1(SqStack1 S,SElemType1 *e) /* 若栈不空,则用 e 返回 S 的栈顶元素,

并返回 OK;否则返回 ERROR */

2、主程序模块的整体流程

在主函数中,采用多分支程序设计语句 switch()使程序产生不同的流向,从而达到实

现课程设计的各个要求。

void main()

{

printf("\n1 >>>输入正确的前缀表达式");

printf("\n2 >>>带括弧的中缀表示式输出");

printf("\n3 >>>对变量进行赋值");

printf("\n4 >>>对算数表达式求值");

printf("\n5 >>>构造一个新的复合表达式");

printf("\n0 >>>退出");

while

(1)

{

switch( )

{

根据不同的选择,调用不同的操作函数,完成各个操作;

}

}

}

2、本程序有四个模块,主程序模块,二叉树模块,两个顺序栈模块。

四者

的调用关系如下:

主程序模块中的对于表达式的存储结构调用了二叉树模块,而在构造表达式的二叉树

模块中又调用了顺序栈 SqStack 模块,主程序中在将原表达式形式输入表达式转换为前缀

表达式操作中调用了顺序栈 SqStack1 模块。

 

二叉树模块

主程序模块

 

顺序栈 SqStack1 模块

 

顺序栈 SqStack 模块

三、详细设计

1、二叉树的存储类型

/*二叉树结点类型*/

typedef enum{INT,CHAR}ElemTag;/*INT 为整型数据 num,CHAR 为字符型数据 c*/

typedef struct TElemType

{

ElemTag tag;/*{INT,CHAR}指示是整型还是字符型*/

union

{

int num;/*tag=INT 时,为整型*/

char c;/*tag=CHAR 时,为字符型*/

};

} TElemType;

/*二叉树的二叉链表存储表示 */

typedef struct BiTNode

{

TElemType data;

struct BiTNode *lchild,*rchild; /* 左右孩子指针 */

}BiTNode,*BiTree;

二叉树的基本操作已经在构造表达式和表达式中的基本操作中根据不同的功能和实际

情况修改了,详细见各个函数操作的算法设计。

2、顺序栈的存储类型

/*栈的顺序存储表示 */

#define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */

#define STACKINCREMENT 2 /* 存储空间分配增量 */

/*两个顺序栈*/

typedef struct SqStack

{

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

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

int stacksize; /* 当前已分配的存储空间,以元素为单位 */

}SqStack; /* 顺序栈 SqStack */

typedef struct SqStack1

{

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

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

int stacksize; /* 当前已分配的存储空间,以元素为单位 */

}SqStack1; /* 顺序栈 SqStack1 */

相关的基本操作见上面的“expression.h 文件的整体结构”的说明,详细的算法设计

见附录的程序清单。

3、表达式的基本操作

Status Input_Expr(char *string,int flag);

/*以字符序列的形式输入语法正确的前缀表达式,保存到字符串 string*/

/*参数 flag=0 表示输出的提示信息是"请输入正确的前缀表示式:

"*/

/*flag=1 表示输出的提示信息为"请以表达式的原书写形式输入正确表示式:

"*/

void judge_value(BiTree *E,char *string,int i);

/*判断字符 string[i],如果是'0'-'9'常量之间,二叉树结点存为整型;否则,存为

字符型*/

Status ReadExpr(BiTree *E,char *exprstring);

/*以正确的前缀表示式并构造表达式 E*/

Status Pri_Compare(char c1,char c2);

/*如果两个字符是运算符,比较两个运算符的优先级,c1 比 c2 优先,返回 OK,否则

返回 ERROR*/

void WriteExpr(BiTree E);

/*用带括弧的中缀表达式输入表达式*/

void Assign(BiTree *E,char V,int c,int *flag);

/*实现对表达式中的所有变量 V 的赋值(V=c),参数 flag 为表示是否赋值过的标志*/

long Operate(int opr1,char opr,int opr2);

/*运算符运算求值,参数 opr1,opr2 为常量,opr 为运算符,根据不同的运算符,实

现不同的运算,返回运算结果*/

Status Check(BiTree E);

/*检查表达式是否还存在没有

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 书信模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1