表达式用二叉树表示

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构程序报告(3)2. 需求分析:

(1)功能:表达式可以用二叉树表示,对于简单的四则运算,请实现以下功能【1】对于任意给出的前缀表达式(不带括号)、中缀表达式(可以带括号)或后缀表达式(不带括号),能够在计算机内部构造出一棵表达式二叉树,并且图示出来(图形的形式)。

【2】对于构造好的内部表达式二叉树,按照用户的要求输出相应的前缀表达式(不带括号)、中缀表达式(可以带括号,但不允许冗余括)或后缀表达式(不带括号)。

提示:所谓中缀表达式中的冗余括号,就是去掉括号后不影响表达式的计算顺序。例如:“(c+b)+a”中的括号是冗余的,可以表示成不冗余的“c+b+a”。

(2)输入输出要求:请输入字符串表达式:

树形二叉树(图形显示)

中缀表达式为:

前缀表达式为:

后缀表达式为:

3.概要设计:(算法)

分成两部分完成:

【1】前缀、中缀、后缀表达式->二叉树表达式

前缀表达式->二叉树表达式:(a)碰到操作数则把其值赋给相应的新申请的二叉树结点,地址压栈;(b)碰到操作符则把其值赋给相应的新申请的二叉树,并从

栈中弹出两个地址,分别作为其右指针和左指针,然后再把其地址压栈,最后一个

地址即为二叉树的根结点地址。

中缀表达式->二叉树表达式:把中缀表达式转换成后缀表达式,然后再建立二叉树。

后缀表达式->二叉树表达式:(a)碰到操作数则把其值赋给相应的新申请的二叉树结点,若栈为空则地址压栈,若非空则取栈顶元素,若栈顶元素的左孩子为空

则当前结点设为其左孩子,左孩子为满则设为其右孩子再压栈;(b)碰到操作数则

把其值赋给相应的新申请的二叉树结点,取栈顶元素,若栈顶元素的左孩子为空则

设为其左孩子,左孩子为满则设为其右孩子开始那个元素地址为根结点地址,开始

时用变量root保存。

【1】二叉树表达式->前缀、中缀、后缀表达式

二叉树表达式->前缀表达式:对二叉树表达式进行前序遍历。

二叉树表达式->中缀表达式:对二叉树表达式进行中序遍历,若结点操作符的优先级高于其左或右子树,在打印相应的子树之前先打印开括号,在打印相应的子

树最后在打印一个闭括号。

二叉树表达式->后缀表达式:对二叉树表达式进行后序遍历。

建立表达式树就是建立树中的每一个结点,将每一个结点链接起来就是整棵树。而在建立深度低的结点时要将其左右指针指向之前建立的深度比它高一级的结点(如’*’要指向’2’和’3’,而’+’又要指向’*’)。这样我们可以用栈来存放每次建立的结点,按照优先级(表达式为中缀型)或顺序扫描表达式(表达式为波兰式与逆波兰式)建立每一个结

点。建立结点的顺序即为表达式求值的顺序。如果扫描到操作数则直接新建一个左右指针为空的结点,并压入结点栈中(存放结点指针)。遇到运算符时首先新建一个结点,然后从栈中依次弹出两个结点,并让新建立的结点的左右指针域指向它们。当所有结点建立完毕时,如果表达式没有错误(这里假设输入表达式正确),这时栈中应该只剩下一个结点,它就是所建立的表达式的根结点。

4. 详细设计:(具体方法)

首先创建一个节点类TNode:包含操作符oper、左孩子left、右孩子right,isOper ()判断是否为操作符,getOperOrder()返回运算符op所对应的优先级,freeTree()程序结束销毁二叉树,postOrder()先序遍历,preOrder()后序遍历,inOrder()中序遍历,ExpTree1()后缀表达式生成二叉树,ExpTree3()前缀表达式生成二叉树,ExpTree2()中后缀表达式生成二叉树,count()求值函数,paint()输出函数

附程序:

#include

#include

#include

#include

#include<>

using namespace std;

class TNode

(2)请输入字符串表达式:1+2*3-4

-

+ 4

1*

2 3

中缀表达式为:1+2*3-4

前缀表达式为:-+1*234

后缀表达式为:123*+4-

memory free memory free memory free memory free memory free

请按任意键继续………………………..

(3)请输入字符串表达式:123*+4-

-

+ 4

1*

2 3

中缀表达式为:1+2*3-4

前缀表达式为:-+1*234

后缀表达式为:123*+4-

memory free memory free memory free memory free memory free

请按任意键继续………………………..

测试截图:

6.总结:

程序调试中的问题及解决方法:前缀表达式建树,通过入栈出栈操作求出前缀表达式的逆序,针对得到的逆序表达式通过后缀表达式建立二叉树的方法,遇到操作数则入栈,遇到操作符则从栈中弹出两个操作数构建一棵小的二叉树,然后将小树的根节点入栈以便于下次操作。经过循环,小树“长成”大树,表达式读完二叉树即建成。

心得体会:由于之前的上机较简单,经过这次作业我才深深感受到编程的滋味,真是苦中有乐,完成之后觉得知识点掌握的更加透彻了,因为有好多问题是不上机根本想不到的,只有经过了实践才会有提高,自己还是太缺乏锻炼,应该多动手编程,从整理思路、编写代码、调试程序修改错误等各方面不断完善自己

7.使用说明:

请输入字符串表达式:可为前缀、中缀、后缀表达式(程序自动判断)

相关文档
最新文档