数据结构 四则运算表达式求值 实验四报告.docVIP

  • 87
  • 0
  • 约7.61千字
  • 约 12页
  • 2017-05-21 发布于浙江
  • 举报

数据结构 四则运算表达式求值 实验四报告.doc

数据结构 四则运算表达式求值 实验四报告

HUNAN UNIVERSITY 实验四最终报告 题 目: 四则运算表达式求值 学生姓名 学生学号 专业班级 指导老师 李晓鸿 完 成 日 期 2014年5月8日 需求分析 本程序要求把用户输入的中缀四则算术表达式,转化为后缀表达式,并计算出结果,然后输出到DOS界面。 输入形式: 21+23*(12-6) 处理非法操作,对输入表达式含有两个连续的运算符、除数为0、括号不匹配的非法输入报错。 输出形式: 输入表达式正确时,输出转换后的后缀表达式,显示计算结果。 输入表达式错误时,对相应的非法输入显示报错的提示。 程序功能:用二叉树实现四则运算表达式的求值,并把输入的中缀四则运算表达式转换成后缀表达式后,计算结果输出。 测试数据 包含合法输入和非法输入的情况后,共有四种情况: 输入:21+23*(12-6) 输出:后缀表达式为:23 12 6 -*+ result is 159 输入:((1+2)*3 输出:错误!括号不匹配! 输入:12-5/0 输出:后缀表达式为:32 5 0 / + 错误!除数不能为0! 输入:1++3*3 输出:错误!不能有连续的两个运算符! 二、概要设计 抽象数据类型 使用二叉树实现四则运算表达式的求值,为本问题确定一个树型关系,数据对象为树的每一个结点。因为表达式中会含有实数和字符,所以树每一个结点将要存放的数据既可能为实数也可能为字符。在创建二叉树时,用两个堆栈先分别存储字符和操作数,根据操作数和操作符间的运算关系,把操作数和操作符存储到二叉树的结点中。 根据算术运算的普遍规律,我们为程序中所存储的操作数定义为浮点型变量。 二叉树节点BinNode的ADT: 数据对象:Elem 基本操作: void setVal(const Elem e) {it = e; } inline BinNode* left() const =0; {return lc;} //返回左子节点的节点信息 inline BinNode* right() const =0; {return rc;}//返回右子节点的节点信息 二叉树BiTree 的ADT: 数据对象D:D是BinNode类的数据元素的集合 数据关系R: 若D为空集,则称为空树 。 否则: (1) D中存在唯一的称为根的数据元素root; (2) 当n1时,其余结点可分为m (m0)个互不相交的有限集T1, T2, …, Tm棵子集本身又是一棵符合本定义的树,称为根root 基本操作: void creatTree(BinNodePtr*,char*); //创建二叉树 void postTraver(BinNodePtr*,char*,int); //后序周游二叉树 int creatNode(StackBinNodePtrchar ** ,char * ); //创建存储操作数的叶子节点 void creatSub(StackBinNodePtrchar* ,char);//创建存储操作符的节点 堆栈的ADT: 数据对象D:D是BinNode类的数据元素的集合 数据关系:R={ai-1 ,ai|ai-1,ai∈D,i=1,2,3….n} 基本操作: bool push(const BinNode item); //入栈 bool pop(BinNode it); //出栈 bool topValue(BinNode it) const; //获取栈顶的值 int length() const; //栈的长度 算法的基本思想 构建二叉树,把输入的表达式存储在字符数组中,遍历字符数组把字符压入一个栈中,并逐个弹出栈中字符,根据字符的ASCⅡ判断字符表示数字或者运算符。若字符表示数字时,二叉树中以左子树表示第一操作数,右子树表示第二操作数,为她创建一个叶子结点保存,并把结点压入操作数栈中;若字符为运算符,并且运算符优先的情况下,把运算符存储为子结点的根结点,压入运算符栈中,直至栈为空。对二叉树进行后续遍历,可以得到后缀表达式。 运算时,运算符栈顶弹栈,然后获取操作数栈顶和次栈顶的值进行运算,把运算结果创建一个叶子结点

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档