欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOC文档下载  

    数据结构课程设计报告十进制二叉树四则运算计算器设计与实现.doc

    • 资源ID:9957065       资源大小:679KB        全文页数:18页
    • 资源格式: DOC        下载积分:4
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要4
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    数据结构课程设计报告十进制二叉树四则运算计算器设计与实现.doc

    成绩 中国农业大学课程设计报告书(2010-2011学年夏季学期)设计题目:十进制四则运算计算器设计与实现 课程名称: 数据结构 任课教师: 彭 波 班级: 试验092 学号: 0958020205 姓名: 曹 津 课程设计报告书格式要求(封皮的背面):1. 课程设计报告书采用统一封面,以左侧为准装订成册。2. 课程设计报告书一律使用标准A4复印纸打印或使用标准A4复印纸手写稿形式上交。3. 课程设计报告书打印的格式要求:课程设计标题(使用隶书二号字体加黑;一级标题、二级标题分别使用黑体三号、四号字体加黑)正文(使用宋体小四号,行距20磅)算法代码及源程序代码(使用Times New Roman五号)十进制四则运算计算器设计与实现1. 问题描述(1) 题目要求:利用二叉树表示算术表达式的基础上,设计实现一个十进制的四则运算计算器。(2) 基本要求:由用户输入中缀四则运算表达式,由程序计算所输入四则运算表达式的结果并输出。(3) 测试数据:12 - ( - 4 ) * ( ( 20 + 3 / 5 ) * 8 / 5 ) * ( - 4 ) #- ( 22.7 - 4208.3 ) / ( ( 2.4 + 1.6 ) * 12 ) + 4.4 - 2.9 #10 - ( - 3 ) * ( ( 21 + 3 / 5 ) * 8 / 3 ) * ( - 2 ) # 运行结果:-515.36 88.7 -335.62. 需求分析(1) 本程序用于求出用户输入的任意合法四则运算表达式的值。(2) 程序运行后显示提示信息,由用户输入任意四则运算表达式,倘若所输入的表达式不合法程序将报错。(3) 用户输入四则运算表达式完毕,程序将输出运算结果。(4) 测试用的表达式须是由+、-、*、/运算符,括号“(”、“)”与相应的运算数组成。运算数可以是无符号浮点型或整型,范围在065535。3. 概要设计为了实现上述程序功能,应以字符串表示用户输入的表达式,进而将用户输入的表达式转化为二叉树形式存储供计算的类型。期间还须用到堆栈数据类型。(1) 二叉树的抽象数据类型定义ADT BinaryTree 数据对象:表达式运算数 num | 0< num < 65535 表达式运算符 opr | + , - , * , / 数据关系:由一个根结点和两棵互不相交的左右子树构成,且树中结点具有层次关系。根结点必须为运算符,叶子结点必须为运算数。基本操作: InitBiTree(&T , &S) 初始条件:存在一四则运算前缀表达式S。 操作结果:根据前缀表达式S构造相应的二叉树T。 DestroyBiTree(&T) 初始条件:二叉树T已经存在。 操作结果:销毁T。 Value(&T) 初始条件:二叉树T已经存在。 操作结果:计算出T所表示的四则运算表达式的值并返回。ADT BineryTree(2) 顺序栈的抽象数据类型定义ADT Stack 数据对象:具有相同类型及后进先出特性的数据元素集合。 数据关系:相邻数据元素具有前去和后继关系。 基本操作: InitStack(&S) 初始条件:无 操作结果:构造一个空栈S。 DestroyStack(&S) 初始条件:栈S已经存在。 操作结果:销毁S。 StackLength(&S) 初始条件:栈S已经存在。 操作结果:返回S中元素个数。 GetTop(S , &e) 初始条件:栈S已经存在且非空。 操作结果:用e返回S的栈顶元素。 Push(&S , e) 初始条件:栈S已经存在。 操作结果:插入元素e为S的新栈顶元素。 Pop(&S , e) 初始条件:栈S已经存在且非空。 操作结果:删除S的栈顶元素,并用e返回其值。ADT Stack(3) 字符串的抽象数据类型定义ADT String 数据对象:具有字符类型的数据元素集合。 数据关系:相邻数据元素具有前驱和后继关系。 基本操作: StrLength(S) 初始条件:串S已经存在。 操作结果:返回S的元素个数。 StrNeg(S , F) 初始条件:串S已经存在且非空。 操作结果:求S的逆序并将结果保存在串F中。ADT String(4) 本程序包含四个模块:主程序模块;二叉树单元模块(实现二叉树的抽象数据类型,包括结点和指针的定义);顺序栈单元模块(实现顺序栈的抽象数据类型,包含结点和指针的定义);字符串单元模块(实现字符串的抽象数据类型)。四个模块之间调用关系如下: 4. 详细设计(1) 顺序栈类型。#define Stack_Size 100typedef struct char elemStack_Size; int top;SqStack 基本操作实现的伪代码算法如下: void InitStack (SqStack &S) /初始化顺序栈 S.elem=new ElemTypeStack_Size; if(!S.elem) Error("Overflow!"); S.top=-1; viod Push (SqStack &S,char c) /顺序栈压栈 if(S.top=(Stack_Size-1) Error("Stack Overflow!"); S.elem+S.top=c; ElemType Pop (SqStack &S) /顺序栈出栈 if(S.top=-1) Error("Stack Empty!"); return S.elemS.top-; int StackLength(SqStack &S) /求顺序栈长度 return (S.top+1); GetTop(SqStack &S ,char e) /取栈顶元素 e=S.elemtop; (2) 字符串类型typedef struct /动态顺序串 char *ch; int length;String基本操作实现的伪代码算法如下:int StrLength(&S) /求串长 return S.length; void StrNeg(&S , &F) /求逆序串if(!S.length) error(“String Empty!”); for(i=0 ; i<length ; i+) F.chi = S.chlength-1-i; (3) 二叉树类型。typedef struct TNode /二叉树结点 union data char optr; /运算符 int opnd; ; /操作数 struct TNode *lchild , *rchildTNodetypedef TNode *BiTree /二叉树指针 基本操作实现的伪代码算法如下:int Precedence (char opr) /判断运算符级别函数;其中* /的级别为2,+ -的级别为1;int level; switch(opr) case+: case-: return (1); break; case*: case/: return(2); break; case(: case): case#: default:return(0); break; bool IsOperator(char opr) /判断输入串中的字符是不是合法操作符if(op=+|op=-|op=*|op=/) return true; else return false; string Convert(string &Str) /将一个中缀串转换为后缀串,string Output; /输出串SqStack S; for(int i=S.length-1 ; i>=0 ; i-) /对输入串逆序扫描 if(Str.chi>=48&&Str.chi<=57) Output.chi=Str.chi; /假如是操作数,把它添加到输出串中。 Output.length+; if( Str.chi=) ) /假如是右括号,将它压栈。Push( S , Str.chi ); while( IsOperator( si ) ) /如果是运算符 if( top=0 | GetTop(S)=) | Precedence(Str.chi ) >=Precedence( GetTop(S) ) ) Push( S , Str.chi ); break; else Pop(S , e); Output.chi=e; Output.length+; if( Str.chi=( ) /假如是左括号,栈中运算符逐个出栈并输出,直到遇到右括号。右括号出栈并丢弃。 while( GetTop(S)!=) ) Output.chi=Pop(S); Output.length+; while(S.top!=-1) /假如输入完毕,栈中剩余的所有操作符出栈并加到输出串中。 Output.ch=Output.ch-; Output.ch=Pop(S); return output;void CreatBiTree(&T , &S) /由中缀表达式生成表达式二叉树 String F; SqStack Sq; /用以存放生成的二叉树结点 InitStack(Sq); F=Convert(S); /求得S的前缀表达式 for(i=F.length-1 ; i>=0 ; i-) If( !IsOperator(F.chi) ) T=new TNode; T->data=F.chi; T->lchild=NULL; T->rchild=NULL; Push(Sq , T) else T=new TNode; T->data=F.chi; T->lchild=Pop( Sq ); T->rchild=Pop( Sq ); Push(Sq , T); int Calc(int a, char opr, int b) /计算 switch (opr) case +: return a + b; case -: return a - b; case *: return a * b; case /: return a / b; int Value(TNode *T) if (T->lchild = NULL &&T->rchild = NULL) return T->data; else return Calc( Value(T->lchild) , T->data , Value(T->rchild) );(4) 主函数伪码算法。void main() Face(); /输出界面及相关信息 do cout<<”Please input an expression:”<<endl; cin>>Str; JudgeExp(S); /判断输入的表达式是否合法。 T=CreatBiTree(S);N=Value(T); cout<<”The value of this expression is”<<N<<endl;cout<<”To do another calculation? Y/N” ;cin>>e; if(e=y) flag=1;else flag=0; while(flag) /main(5) 函数调用关系图。5. 调试分析(1) 程序中使用的字符串类型可直接引用C+自带的类型库<string.h>,没必要自行定义。(2) 算法时间复杂度分析。对于由表达式字符串生成二叉树的操作,由于是对字符串顺序扫描根据扫描到当前字符的情况决定操作,以n代表输入的表达式字符串长度,则此算法时间复杂度为0(n)。对于二叉树求值操作,由结点数量决定时间,n为结点个数,则其时间复杂度为O(n)。(3) 算法空间复杂度分析。构造两个顺序栈各需一个ElemType类型的Stack_Size为100的栈空间,空间复杂度为O(1)。各算法中使用的辅助空间均与元素个数无关,是为O(1)。6. 使用说明程序运行后用户根据提示输入要计算的四则运算表达式,整型数浮点数均可,注意不要带空格,尽量保证所输入的表达式是合法表达式。输入完毕后回车键确定,程序输出结果。7. 测试结果8. 附录(带注释的源程序)/*CStack.h*/#include<iostream>using namespace std;#define Stack_Size 100typedef struct /字符类型顺序栈 char elemStack_Size; int top;CStackvoid InitCStack(&S) /初始化顺序栈 S.elem=new charStack_Size; if(!S.elem) Error("Overflow!"); S.top=-1;void Push_C(CStack &S , char e) /压栈 if( S.top=(Stack_Size-1) ) Error("Stack Overflow!"); S.elem+S.top=e;char Pop_C(CStack &S) /出栈 if(S.top=-1) Error("Stack Empty!"); return S.elemtop-;char GetTop(&S) /取栈顶元素 if(S.top=-1) Error("Stack Empty!"); return S.elemtop;int CStackLength(&S) /求栈中元素个数 return top+1;/*TStack.h*/#include<iostream>#include"Tree.h"using namespace std;#define Stack_Size 100typedef struct /二叉树结点类型顺序栈 TNode elemStack_Size; int top;TStackvoid InitTStack(&S) /初始化顺序栈 S.elem=new charStack_Size; if(!S.elem) Error("Overflow!"); S.top=-1;void Push_T(TStack &S , TNode T) /压栈 if( S.top=(Stack_Size-1) ) Error("Stack Overflow!"); S.elem+S.top=T;TNode Pop_T(TStack &S) /出栈 if(S.top=-1) Error("Stack Empty!"); return S.elemtop-;/*String.h*/#include<iostream>using namespace std;typedef struct /动态顺序串 char *ch; int len;StringSrting StrNeg(&Str) /求逆序串 String F; for(i=0 ; i<length ; i+) F.chi = Str.chStr.len-1-i; return Fint StrLen(&Str) /求串长 int i; for(i=0 ; Str.chi!=0 ; ) i+; return i;/*Tree.h*/#include<iostream>#include"String.h"#include"CStack.h"#include"TStack.h"using namespace std;typedef struct /二叉树结点 union data /数据域 char opr; /运算符 int opn; /运算数 struct TNode *lchid , *rchild; /指针域TNodetypedef TNode *BiTree; /二叉树头结点int Precedence(char opr) /判断运算符级别函数;其中* /的级别为2,+ -的级别为1; switch(opr) case+: case-: return 1; break; case*: case/: return 2; break; case(: case): case#: default: return 0; break; bool IsOperator(char opr) /判断输入串中的字符是不是合法操作符 if(op=+|op=-|op=*|op=/) return true; else return false;String Convert(String &Str) /将一个中缀串转换为后缀串 int i; String Output; /输出串 Output.len=0; CStack S; InitCStack(S); Str.len=StrLen(Str); /求的输入的串长 for(i=Str.len-1 ; i>=0 ; i-) /对输入串逆序扫描 if(Str.chi>=48 && Str.chi<=57) /假如是操作数,把它添加到输出串中。 Output.chStr.len-1-i=Str.chi; Output.len+; if( Str.chi=) ) /假如是右括号,将它压栈。 Push_C( S , Str.chi ); while( IsOperator( Str.chi ) ) /如果是运算符 if( S.top=0 | GetTop(S)=) | Precedence(Str.chi ) >=Precedence( GetTop(S) ) ) Push_C( S , Str.chi ); break; else Output.chStr.len-1-i=Pop_C(S); Output.len+; if( Str.chi=( ) /假如是左括号,栈中运算符逐个出栈并输出 /直到遇到右括号。右括号出栈并丢弃。 while( GetTop(S)!=) ) Output.chStr.len-1-i=Pop_C(S); Output.len+; while(S.top!=-1) /假如输入完毕,栈中剩余的所有操作符出栈并加到输出串中。 Output.ch+Output.len-1=Pop_C(S); return StrNeg(Output); /输出Output的逆序即为所求前缀表达式void CreatBiTree(&T , &Str) /由中缀表达式生成表达式二叉树 String F; TStack S; /用以存放生成的二叉树结点 InitTStack(S); F=Convert(Str); /求得S的前缀表达式 for(i=F.len-1 ; i>=0 ; i-) if( !IsOperator(F.chi) ) T=new TNode; T->data=F.chi; T->lchild=NULL; T->rchild=NULL; Push_T(S , T) else T=new TNode; T->data=F.chi; T->lchild=Pop_T( S ); T->rchild=Pop_T( S ); Push_T(S , T); int Calc(int a, char opr, int b) /计算 switch (opr) case +: return a + b; case -: return a - b; case *: return a * b; case /: return a / b; int Value(TNode *T) /求表达式二叉树的值 if (T->lchild = NULL &&T->rchild = NULL) return T->data; else return Calc( Value(T->lchild) , T->data , Value(T->rchild) );/*JudgeExp.h*/#include<iostream>#include"String.h"#include"Tree.h"using namespace std;bool JudegExp(String Exp) /此函数验证式子是否正确,即是否符合运算规则。 char check; int error=0; int lb=0; int rb=0; if(StrLen(Exp)=1 && Exp.ch0!=-) return false; else if( (IsOperator(Exp.ch0)&& Exp.ch0!=- | IsOperator( Exp.chStrLen(Exp)-1 ) ) && Exp.ch0!=( && Exp.chStrLen(Exp)-1!=) ) /此处若不加,在遇到某些式子时,会出现非法操作。 return false; for(int m=0 ; m<StrLen(Exp) ; m+) check=Exp.chm; if(m=0 && check=- && (IsDigit(Exp.ch1)!=0 | Exp.ch1=( ) ) check=Exp.ch+m; if( IsOperand(check) ); /如果是数字,跳过,不管。 else if(IsOperator(check) if( check=) ) rb+; if( IsOperator(Exp.chm+1)&&(Exp.chm+1=+|Exp.chm+1=-|Exp.chm+1=*|Exp.chm+1=/|Exp.chm+1=|Exp.chm+1=) ) ) m+; if( Exp.chm=) ) rb+; else if( IsOperator(Exp.chm+1) ) error+; else if( check=( ) lb+; if( Exp.chm+1=( ) m+; lb+; else if(IsOperator(Exp.chm+1) && Exp.chm+1!=-)

    注意事项

    本文(数据结构课程设计报告十进制二叉树四则运算计算器设计与实现.doc)为本站会员(土8路)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开