数据结构实验报告 图
问题描述:;四则运算表达式求值,将四则运算表达式用中缀表达式;一、需求分析:;1、本程序是利用二叉树后序遍历来实现表达式的转换;2、输入输出格式:;输入格式:在字符界面上输入一个中缀表达式,回车表;请输入表达式:;输入一个中缀表达式;输出格式:如果该中缀表达式正确,那么在字符界面上;式,其中后缀表达式中两相邻操作数之间利用空格隔开;果不正确,在字符界面上输出
问题描述:
四则运算表达式求值,将四则运算表达式用中缀表达式,然后转换为后缀表达式,并计算结果。
一、 需求分析:
1、本程序是利用二叉树后序遍历来实现表达式的转换,同时可以使用实验三的结果来求解后缀表达式的值。
2、输入输出格式:
输入格式:在字符界面上输入一个中缀表达式,回车表示结束。
请输入表达式:
输入一个中缀表达式
输出格式:如果该中缀表达式正确,那么在字符界面上输出其后缀表达
式,其中后缀表达式中两相邻操作数之间利用空格隔开;如
果不正确,在字符界面上输出表达式错误提示。
逆波兰表达式为:
3、测试用例
输入:21+23*(12-6)
输出:21 23 12 6 -*+ 输出逆波兰表达式 运算结果为:输出运算后的结果
二、概要设计 :
抽象数据类型
二叉树类BiTree
算法的基本思想
根据题目要求,利用栈计算,和二叉树存储,来计算表达式
该算法的基本思想是:
先利用栈进行计算,然后用二叉树进行存储,和实验三算法一样来计算逆波兰表达式的值
程序的流程
程序由三个模块组成:
(1) 输入模块:输入一个运算式
(2) 计算模块:利用栈进行表达式的计算,二叉树来存储。 (3 ) 输出模块:屏幕上显示出后缀表达式和运算结果。
三、详细设计
物理数据类型
程序含有两个类,其中栈不再赘述,另一个类为二叉树class BiTree包含私有成员struct BiTreeNode,根节点BiTreeNode *T;索引index; int number_of_point 优先级比较函数 compare(char a,char b);生成树的'函数void InorderCreate(BiTreeNode *&T,char str[30][10],int start,int end);判断数字函数bool IsNumber(char a);求值函数double Operate(BiTreeNode *T);还有显示后缀表达式的函数void display(BiTreeNode *T) ;而公有成员函数则是对私有函数的重载,为方便使用,因为函数中普遍使用了递归的算法。
算法的时空分析
此算法利用栈和二叉树来实现,故次算法的的时间复杂度为(N)。
输入和输出的格式
输入格式:请输入表达式:
输入一个中缀表达式 //回车
输出格式:逆波兰表达式为:
输出逆波兰表达式
运算结果为:输出运算后的结果
四、调试分析
略。
五、测试结果
本实验的测试结果截图如下:
六、用户使用说明(可选)
1、本程序的运行环境为windows 操作系统,执行文件为 2 、运行程序时
提示输入表达式
本程序可以将中缀表达式转换为后缀表达式后在计算出运算式的结果。 提示:请输入表达式:
输出
提示:逆波兰表达式为:
运算结果:
七、实验心得(可选)
本次实验过程比较复杂,由于书上的知识掌握的还不是很牢靠,所以现在实验做起来有点儿吃力。本实验主要是通过与同学的讨论和课后查阅资料来完成的,虽然有些地方还不是很懂,但基本上能完成此次实验的内容。而且通过本次实验,加深了对二叉树算法的了解。
附录(实验代码):
#include
#include
#include
#include
#include
#include
#define STACK_INIT_SIZE 100
#define DATA_SIZE 10
#define STACKINCREMENT 10
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OVERFLOW -2
using namespace std;
typedef float SElemtype;
typedef int Status;
typedef char * TElemType;
typedef struct BiTNode {
TElemType data;
int len; //data字符串中字符的个数
struct BiTNode * lchild, * rchild;
}BiTNode, *BiTree;
typedef struct
{
SElemtype *base;
SElemtype *top;
int stacksize;
} SqStack;
Status IsDigital(char ch)
{ if(ch>='0'&&ch<='9')
{return 1; //是数字字母
}
return 0; //不是数字字母
}
int CrtNode(stack &PTR, char *c)
{
BiTNode * T;
int i=0;
T = (BiTNode *)malloc(sizeof(BiTNode));
T->data = (char *)malloc(DATA_SIZE*sizeof(char));
while(IsDigital(c[i]))
{T->data [i] = c[i];
i++; }
T->len = i;
T->lchild = T->rchild = NULL;
(T);
return i;
}
void CrtSubTree(stack &PTR, char c)
{BiTNode * T;
T = (BiTNode *)malloc(sizeof(BiTNode));
T->data = (char *)malloc(DATA_SIZE*sizeof(char));
T->data [0] = c;
T->len = 1;
T->rchild = (); //先右子树,否则运算次序反了
();
T->lchild = ();
();
(T);
}
char symbol[5][5]={{'>', '>', '<', '<', '>'}, //符号优先级
{'>', '>', '<', '<', '>'},
{'>', '>', '>', '>', '>'},
{'>', '>', '>', '>', '>'},
{'<', '<', '<', '<', '='}};
int sym2num(char s) //返回符号对应优先级矩阵位置 { switch(s)
{
case '+': return 0; break;
case '-': return 1; break;
case '*': return 2; break;
case '/': return 3; break;
case '#': return 4; break;
}
}
char Precede(char a, char b) //返回符号优先级
{return(symbol[sym2num(a)][sym2num(b)]);}
void CrtExptree(BiTree &T, char exp[])
{ //根据字符串exp的内容构建表达式树T
stack PTR;//存放表达式树中的节点指针
stack OPTR;//存放操作符
char op;
int i=0;
('#');
op = ();
while( !((exp[i]=='#') && (()=='#')) ) //与
{
if (IsDigital(exp[i]))
{//建立叶子节点并入栈 PTR
i+=CrtNode(PTR, &exp[i]);
}
else if (exp[i] == ' ')
i++;
else{
switch (exp[i])
{
case '(': {
(exp[i]);
i++;
break;}
case ')': {
op = (); ();
while(op!='('){
CrtSubTree(PTR, op);
op = (); ();
}//end while
-
[通用]综合素质自我陈述报告
在经济发展迅速的今天,报告不再是罕见的东西,我们在写报告的时候要避免篇幅过长。一听到写报告就拖延症懒癌齐复发?以下是小编帮大家整理的综合素质自我陈述报告,欢迎大家借鉴与参考,希望对大家有所帮助。综合素质自我陈述报告篇1伴随着21世纪的脚步,我即将走完多彩...
-
人力资源述职报告范文
在经济飞速发展的今天,报告对我们来说并不陌生,报告成为了一种新兴产业。一听到写报告就拖延症懒癌齐复发?下面是小编帮大家整理的人力资源述职报告范文,供大家参考借鉴,希望可以帮助到有需要的朋友。人力资源述职报告范文篇1今年,为了实现公司利益的最大化,针对我们...
-
语文上册教育教学质量报告通用
在人们越来越注重自身素养的今天,越来越多人会去使用报告,不同种类的报告具有不同的用途。一起来参考报告是怎么写的吧,以下是小编收集整理的语文上册教育教学质量报告通用,仅供参考,欢迎大家阅读。语文上册教育教学质量报告通用1一、命题的指导思想与原则“夯实双...
-
社区委员述职报告范文
在经济发展迅速的今天,报告使用的次数愈发增长,报告成为了一种新兴产业。那么什么样的报告才是有效的呢?下面是小编为大家收集的社区委员述职报告范文,欢迎大家借鉴与参考,希望对大家有所帮助。社区委员述职报告范文1尊敬的各位领导、居民代表们:你们好!我叫XX,是xx社...