首页 > 代码库 > 广工 数据结构 表达式类型求值(上)
广工 数据结构 表达式类型求值(上)
一、 需求分析
一个表达式和一棵树之间存在自然的对应关系,实现以下操作:
(1)以字符序列的形式输入语法正确的后缀表达式并构造表达式。
(2)可实现对应原表达式的加、减、乘、除四则混合运算。
(3)运算数可以是整数、实数或变量,若是变量,可对变量赋值,以求得对应原表达式的值。
(4)可以求表达式的中缀和后缀序列,还可以求所建立的二叉树的深度。
【测试数据】
1)分别输入0;a; -91; 2 4 +; 1.5 a uuu / *; 2 11 + 3 ^并输出。
2)每当输入一个表达式后,对其中的变量赋值,然后对表达式求值。
3)还有很多测试的数据,详细请读者自行测试。
二、 概要设计
1. 抽象数据类型Expression的定义如下:
ADT Expression
{
数据对象D:D是具有数值的常量C和没有数值的变量V;
数据关系:R={<(V或者C)P(V或者C)>|V,C∈D, <(V或者C)P(V或者C)>表示 由运算符P结合起来的表达式E}
基本操作:
void Input(SqStack &S, BiTree &T)
初始条件:S, T 存在
操作结果:输入函数,用来创建二叉树的核心函数
Status Judge(SqStack &S){
初始条件:S存在。
操作结果:判断输入的表达式是否为正确的后缀表达式
LinkQueue HierarchyBiTree(BiTree Root)
初始条件:T 存在
操作结果:层次遍历二叉树,把结果保存在LinkQueue
void Print(LinkQueue Q, BiTree T)
初始条件:Q为进行层次遍历得到的队列
操作结果:层次遍历打印。
void Perorder(BiTree t)
初始条件:树T存在。
操作结果:前序遍历
void Inorder(BiTree t)
初始条件:树T存在。
操作结果:中序遍历。
void Assign(BiTree T, char V, int c, int *flag)
初始条件:树T存在,v为要赋值的变量,c为赋的值,flag为标志位
操作结果:对表达式中的所有变量V的赋值c,参数flag为表示是否赋值过 的标志
Status Caculate(BiTree T, SqStack &S)
初始条件:S, T存在
操作结果:后序遍历,利用栈对表达式进行运算,最后结果以结点的形式存放 在栈中
int Depth(BiTree T)
初始条件:树T存在。
操作结果:求深度
}ADT Expression
2. 主程序
void main()
{ //伪代码
Designer();
while(1){
Menu();
scanf(" %c", &n);
if(n == ‘0‘)
break;
else if(‘1‘<=n && n<=‘6‘){ //1 ~ 6之间
switch(n){
case ‘1‘:
Input(S, T);
case ‘2‘:
Q = HierarchyBiTree(T); Print(Q, T);
case ‘3‘:
Perorder(T);
Inorder(T);
case ‘4‘:
Assign(T, ch, n, &Assign_tag);
case ‘5‘:
Caculate(T, S1) ;
case ‘6‘:
int d = Depth(T);
default: break;
}
printf("\t\t\t已安全退出,感谢使用!\n");
}
3. 本程序包含的模块及其调用关系图
三、 详细设计
主程序模块 |
输出二叉树的形状模块 |
输出二叉树的前缀和中缀模块 |
输入后缀表达式创建二叉树模块 |
对表达式中的变量赋值模块 |
计算表达式的值 |
求二叉树的深度 |
队列、栈和二叉树的类型
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
typedef int Status;
//二叉树节点类型
typedef enum { INT, DOU, CHAR, OPER} ElemTag; //INT为整型,DOU为实型,CHAR为字符型 ,OPER为操作符
//二叉树数据域
typedef struct TElemTag {
ElemTag tag;
union
{
int n; // INT
double num; // DOU
char c; //CHAR 和 OPER
};
} TElemTag;
//二叉树链式存储结构
typedef struct BiTNode {
TElemTag data; //数据域
struct BiTNode *lchild, *rchild; //左右孩子指针
} BiTNode, *BiTree;
typedef BiTree SElemType; //栈SqStack的元素
//栈的顺序存储结构
#define STACK_INIT_SIZE 30 //初始存储空间
#define STACKINCREMENT 5 //存储空间增量
typedef struct SqStack {
SElemType *base;
SElemType *top;
int stacksize;
} SqStack;
typedef BiTree QElemType; //队列LinkQueue的元素
typedef struct QNode {
QElemType data;
struct QNode * next;
} QNode,*QueuePtr;
typedef struct {
QueuePtr front;
QueuePtr rear;
} LinkQueue;