数据结构课程设计—十进制四则运算计算器的设计与实现
【数据结构】【a】十进制整数四则运算计算器正文终稿

东北大学信息科学与工程学院数据结构课程设计报告题目十进制整数四则运算计算器课题组长余灏然课题组成员魏嘉张越专业名称计算机科学与技术班级计算机1307指导教师杨雷2015 年1月课程设计任务书题目:十进制整数四则运算计算器问题描述:由输入的四则运算表达式字符串,动态生成算术表达式所对应的二叉树,通过表达式二叉树自动求值并输出。
设计要求:设计十进制整数四则运算计算器。
(1)采用二叉树、栈等数据结构。
(2)给定表达式字符串,生成二叉链表的表达式二叉树。
(3)对表达式二叉树采用后序遍历求值并输出。
(4)可以考虑加入复数四则运算功能。
(5)其它完善性功能。
指导教师签字:2014年12月28日目录1 课题概述 (1)1.1 课题任务 (1)1.2 课题原理 (1)1.3 相关知识 (4)2 需求分析 (4)2.1 课题调研 (5)2.2 用户需求分析 (5)3 方案设计 (5)3.1 总体功能设计 (5)3.2 数据结构设计 (5)3.3 函数原型设计 (5)3.4 主算法设计 (5)3.5 用户界面设计 (5)4 方案实现 (6)4.1 开发环境与工具 (6)4.2 程序设计关键技术 (6)4.3 个人设计实现(按组员分工)4.3.1余灏然设计实现 (6)4.3.2 魏嘉设计实现 (9)4.3.3 张越设计实现 (11)5 测试与调试 (13)5.1 个人测试(按组员分工) (13)5.1.1 余灏然测试 (13)5.1.2 魏嘉测试 (16)5.1.3 张越测试 (20)5.2 组装与系统测试 (25)5.3 系统运行 (25)6 课题总结 (26)6.1 课题评价 (26)6.2 团队协作 (26)6.3 个人设计小结(按组员分工) (26)6.3.1 余灏然设计小结 (26)6.3.2 魏嘉设计小结 (27)6.3.3 张越设计小结 (27)7 附录A 课题任务分工 (28)A-1 课题程序设计分工 (28)A-2 课题报告分工 (29)附录C 用户操作手册(可选) (30)C.1 运行环境说明 (30)C.2 操作说明 (30)1 课题背景1.1 课题任务【问题描述】由输入的四则运算表达式字符串,动态生成算术表达式所对应的二叉树,通过表达式二叉树自动求值并输出。
数据结构课程设计-计算器

数据结构课程设计-计算器数据结构课程设计计算器在计算机科学的学习中,数据结构是一门重要的基础课程。
通过这门课程的学习,我们能够深入理解和掌握如何有效地组织和管理数据,以提高程序的运行效率和性能。
本次课程设计的任务是开发一个简单的计算器程序,通过运用所学的数据结构知识,实现基本的算术运算功能。
一、需求分析首先,我们需要明确计算器程序的功能需求。
这个计算器应该能够支持常见的四则运算,即加法、减法、乘法和除法。
用户可以通过输入表达式,例如“2 +3”、“5 2”、“3 4”、“8 /2”等,程序能够正确计算并输出结果。
此外,为了提高用户体验,计算器还应该能够处理错误输入,例如输入的表达式不符合语法规则或者除数为 0 等情况,并给出相应的错误提示信息。
二、数据结构选择为了实现上述功能,我们需要选择合适的数据结构来存储和处理输入的表达式。
在这个计算器程序中,我们可以使用栈这种数据结构。
栈是一种后进先出(Last In First Out,LIFO)的数据结构,非常适合处理表达式的计算。
我们可以创建两个栈,一个用于存储操作数,另一个用于存储操作符。
当用户输入一个表达式时,我们按照从左到右的顺序逐个字符进行处理。
如果是数字,则将其转换为整数并压入操作数栈;如果是操作符,则将其压入操作符栈。
在计算过程中,我们从操作符栈中取出操作符,从操作数栈中取出相应数量的操作数进行计算,将计算结果压回操作数栈。
三、算法设计1、表达式解析算法从左到右扫描表达式。
如果遇到数字,将其作为一个整数提取出来,并压入操作数栈。
如果遇到操作符(+、、、/),则将其压入操作符栈。
如果遇到左括号“(”,则将其压入操作符栈。
如果遇到右括号“)”,则从操作符栈中弹出操作符,从操作数栈中弹出操作数,进行计算,直到遇到左括号为止。
2、计算算法当操作符栈不为空时,从操作符栈中弹出一个操作符。
根据操作符的类型,从操作数栈中弹出相应数量的操作数。
进行计算,并将结果压回操作数栈。
数据结构课程设计算术表达式求值-计算器(Word)

高级语言程序设计《算术表达式求值》课程设计报告算术表达式求值系统可以实现实现对算术四则混合运算表达式求值,并打印求值过程中运算符栈、操作数栈的变化过程。
第二章系统分析开始运行时界面如下:你可以输入一个表达式,按E对其进行求值。
#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <string.h>#define N 100double numStack[N]={0};//操作数栈int numTop;char opStack[N];//运算符栈int opTop;void print_num(double str1[],int n) {int i;printf("\n操作数栈:\n");for(i=0;i<n;i++)printf("%g ",str1[i]);}void print_op(char str2[],int m) {int j;printf("\n运算符栈:\n");for(j=0;j<m;j++)printf("%c ",str2[j]);}int op(char ch)//判断运算符优先级{if(ch=='+'||ch=='-') return 2;if(ch=='*'||ch=='/') return 3;if(ch=='(') return -1;return 0;}double result(double num1,char op,double num2)//计算{if(op=='+') return num1+num2;if(op=='-') return num1-num2;if(op=='*') return num1*num2;if(op=='/') return num1/num2;return 0;}int compute(char str[]){double num=0;int i=0,j=1,k=1;numTop=opTop=0;while(str[i]!='\0'||opTop>0){if(str[i]>='0'&&str[i]<='9')num=num*10+str[i]-'0';else if( k==1&&str[i]=='-'&&(i==0||op(str[i-1])) )k=-1;else{if(i>0&&!op(str[i-1])&&str[i]!='('&&str[i-1]!=')') {numStack[numTop++]=num*k;if(opTop!=0&&numTop!=0)print_num(numStack,numTop);num=0; j=1; k=1;}if(opTop==0||str[i]=='('){opStack[opTop++]=str[i];print_op(opStack,opTop);}else if(str[i]==')'){while(opTop>0&&opStack[--opTop]!='('){numStack[numTop-2]=result(numStack[numTop-2],opStack[opTop],numStack[numTop-1]);if(opTop!=0&&numTop!=0){print_num(numStack,numTop);print_op(opStack,opTop);}numTop--;}if(opStack[opTop]!='(') return 0;}else{if(str[i]=='\0'&&numTop==0) return 0;while(opTop>0&&op(str[i])<=op(opStack[opTop-1])){numStack[numTop-2]=result(numStack[numTop-2],opStack[--opTop],numStack[numTop-1]);if(opTop!=0&&numTop!=0){print_num(numStack,numTop-1); print_op(opStack,opTop);}numTop--;}if(str[i]!='\0')opStack[opTop++]=str[i];if(opTop!=0&&numTop!=0)print_op(opStack,opTop);}}if(str[i]!='\0')i++;}if(numTop!=1||opTop!=0)return 0;return 1;}void menu(){system("cls");printf("_______________________________\n");printf(" Clear(C) | Equal(E) | Quit(Q) \n");printf("-------------------------------\n");}int main(void){int i=0,j=0,k;char str[N]="\0";char num[N]="\0";char save[N]="\0";char ch;double temp;unsigned long temp2;menu();printf("input an expression,press key 'E' to compute\n");ch=getch();while( 1 ){if(ch==')'||op(ch)||ch>='0'&&ch<='9'){str[i++]=ch;str[i]='\0';menu();printf("input an expression,press key 'E' to compute\n"); printf("%s",str);if( ch=='-'&&(i==1||op(str[i-2]))||ch>='0'&&ch<='9' ){num[j++]=ch;num[j]='\0';}elsej=0;}if(ch=='C'||ch=='c'){if(strlen(str))str[--i]='\0';menu();printf("input an expression,press key 'E' to compute\n");printf("%s",str);}if(ch=='E'||ch=='e'){if(compute(str)){printf("\n=%g\n",numStack[0]); j=0; temp=numStack[0];if(temp<0){temp=-temp;num[j++]='-';num[j]='\0';}temp2=(unsigned long)temp;k=1;while(temp2/k>=10) k*=10;while(k){num[j++]=temp2/k+'0';num[j]='\0';temp2=temp2%k;k/=10;}temp=temp-(int)temp;if(temp!=0){num[j++]='.';num[j]='\0';temp+=0.0000005;}for(k=6;k>0;k--){if(temp==0) break;temp*=10;num[j++]=(int)temp+'0';num[j]='\0';temp=temp-(int)temp;}}i=0; j=0; str[0]='\0';}if(ch=='Q'||ch=='q'){printf("\nare you sure to quit?(Y/N)\n");ch=getch();if(ch=='Y'||ch=='y') break;else{menu();printf("input an expression,press key 'E' to compute\n");printf("%s",str);}}ch=getch();}return 0;}第五章系统测试1.先输入: 3+2*5 后按E求值2.再输入:12/4-5 后按E求值3.再输入Q4.输入Y,退出系统。
10进制计数器课程设计

10进制计数器课程设计一、课程目标知识目标:1. 学生能理解10进制计数器的基本概念,掌握10进制数的组成和计数规律。
2. 学生能运用10进制计数器进行数值的加减运算,并正确表达计算过程和结果。
3. 学生了解10进制计数器在日常生活和科学技术中的应用。
技能目标:1. 学生能够独立操作10进制计数器,进行简单的数值计算。
2. 学生通过实际操作,培养观察、分析、解决问题的能力。
3. 学生通过小组合作,提高沟通、协作和团队意识。
情感态度价值观目标:1. 学生对10进制计数器产生兴趣,激发学习数学的积极性。
2. 学生在探索过程中,培养耐心、细致、勇于尝试的精神。
3. 学生认识到数学知识在实际生活中的重要性,增强学以致用的意识。
课程性质:本课程属于数学学科,旨在帮助学生掌握10进制计数器的运用,提高数学运算能力和实际应用能力。
学生特点:四年级学生具有一定的数学基础,好奇心强,喜欢动手操作,但注意力集中时间较短。
教学要求:注重理论与实践相结合,以学生为主体,激发学生兴趣,培养动手操作能力和团队协作精神。
通过分解课程目标为具体的学习成果,使学生在愉快的氛围中掌握知识,提高能力。
二、教学内容1. 引入10进制计数器概念,介绍其在数学运算中的应用。
- 教材章节:第三章《数的认识》- 内容:10进制计数器的定义、计数规律、数位顺序表。
2. 学习10进制计数器的操作方法,进行数值的加减运算。
- 教材章节:第四章《简单的数学计算》- 内容:10进制计数器操作方法、数值加减运算、进位与退位。
3. 实践与应用,运用10进制计数器解决实际问题。
- 教材章节:第五章《生活中的数学》- 内容:运用10进制计数器进行购物找零、时间计算等实际问题的解决。
4. 小组合作,探讨10进制计数器在科学技术领域的应用。
- 教材章节:第六章《数学与科技》- 内容:10进制计数器在计算机、电子设备等领域的应用案例。
教学进度安排:第一课时:引入10进制计数器概念,学习计数规律和数位顺序表。
汇编语言课程设计四则运算计算器..【范本模板】

微机原理实验报告汇编语言课程设计报告( 2012 —- 2013 年度第1 学期)实验名称:实现加减乘除四则运算的计算器专业生物医学工程学生姓名周炳威班级B100904学号B10090406指导教师乐洋实现加减乘除四则运算的计算器1 实验目的深化学习的汇编语言课程基本知识,进一步掌握汇编语言程序设计方法,提高分析问题、解决问题的综合应用能力。
通过使用汇编语言设计实现简单计算器,以此进一步了解和掌握对数据存储,寄存器的使用,加减乘除相关指令以及模块的调用等汇编语言知识的有效运用2 实验内容课题名称:实现加减乘除四则运算的计算器主要功能:实现一个简单的计算器,要求:编写一个程序,每运行一次可执行程序,可以实现加减乘除四则运算。
计算器是最简单的计算工具,简单计算器具有加、减、乘、除四项运算功能。
3 实现方法本次汇编语言课程设计的最终目的是要实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。
由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个数进行运算,而且做的是加法运算、减法运算乘法运算还是除法运算也未可知,为此我们还要判断用户所输入的运算是四则运算中的哪一个运算。
此外,运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。
第一步,用INT 21H的1号功能调用来进行输入.利用1号功能调用来输入,即把单个字符一个个的输入并存储到一个数据区里。
我们要做的是两个数的运算,先认定输入的格式为1234+5678=或者1111*2222=,当然如果输入不是这样的格式计算出来的结果就不一定是我们想要的结果了.在存储的时候也是有选择的存储,当输入的并非格式里所要求的字符时则报错.第二步,设计程序进行判断所输入的算式是做加法运算、减法运算、乘法运算还是除法运算,即判断输入的运算符是‘+'号、‘—'号、‘*’号、‘/’号中的哪一个,因为输入的格式固定了,所以只需要把存进数据区的第三个字符拿来与加减乘除四个运算符号进行比较,和哪一个运算符号一样就调用相对应的运算模块进行计算。
十进制计算机的设计与实现

十进制计算机的设计与实现对于大多数人来说,计算机的学习课程通常涉及二进制计算,而很少有人学习过十进制计算机。
然而,对于更多的业务场景和数据,十进制计算机是非常有用的,例如财务和会计领域的复杂计算。
本文将介绍十进制计算机的设计和实现。
1. 十进制数的表示十进制数通常表示成基数10的幂次方的和。
例如,数字1234的数学表示为:1 * 10³ +2 * 10² +3 * 10¹ +4 * 10⁰在计算机世界中,将十进制数表示为二进制数更为方便。
假设我们有一个32位的计算机,那么我们可以将1234表示为:00000000 00000000 00000100 11010010这些二进制数以四位一组被称为一字节,并且很容易转换为人类可读的十六进制表示形式0x04D2。
2. 十进制计算机的原理十进制计算机使用BCD,也就是二进制编码的十进制,来表示数字。
在BCD中,十进制的每个数字都用四个位来表示。
例如,数字1被表示为0001,数字9被表示为1001。
十进制计算机中使用的寄存器和算术逻辑单元(ALU)与二进制计算机非常相似。
然而,十进制ALU需要能够执行基本的十进制操作,例如“加法”和“减法”。
计算器必须能够正确地处理数位上的进位和借位,这对于BCD是非常重要的。
在十进制计算机中,加法与二进制计算机相比较为复杂。
例如,当相加的数字为9 + 1时,加数和进位位都必须被考虑到。
如果直接将9和1相加,则结果为10,这位10将会被拆分为0和1再进行运算。
因此,计算器必须能够检测到数位上的进位位,以便正确执行加法运算。
3. 十进制计算机的性能与二进制计算机相比,十进制计算机的性能要低得多。
一个基于BCD的十进制计算机通常需要更多的硬件资源才能处理相同的计算,因为在处理数字时每个数字都需要四个位。
举例来说,一个10位的十进制数字可以由40位的BCD数表示。
相比之下,对于同样的数字,二进制计算机可以只使用10位。
课程设计-十进制加法计算器设计

课程设计(论文)任务书电气学院电力系统专业12(1 )班一、课程设计(论文)题目:十进制加法计算器设计二、课程设计(论文)工作自2015年1 月12 日起至2015 年1月16 日止。
三、课程设计(论文) 地点: 电气学院机房10-303四、课程设计(论文)容要求:1.课程设计的目的(1)综合运用单片机原理及应用相关课程的理论知识和实际应用知识,进行单片机应用系统电路及程序设计,从而使这些知识得到进一步的巩固,加深和发展;(2)熟悉和掌握单片机控制系统的设计方法,汇编语言程序设计及proteus 软件的使用;(3)通过查阅图书资料、以及书写课程设计报告可提高综合应用设计能力,培养独立分析问题和解决问题的能力。
2.课程设计的容及任务课程设计容:利用单片机及一些外围电路设计一个简易的十进制加法计算器,硬件电路设计大概主要包括:键盘电路,显示电路以及复位电路和晶振电路。
软件方面的设计主要包括:LED显示程序设计、数值送显示缓存程序设计、读键子程序设计、运算程序的设计。
课程设计任务:设计一个键盘显示装置,键盘上除了定义0~9共10个数字键外,还要相应的功能健,其它键不定义无响应。
利用此系统可分别输入十进制被加数和加数,实现两个数相加并将结果以十进制形式显示出来。
3.课程设计说明书编写要求(1)设计说明书用A4纸统一规格,论述清晰,字迹端正,应用资料应说明出处。
(2)说明书容应包括(装订次序):题目、目录、正文、设计总结、参考文献等。
应阐述整个设计容,要重点突出,图文并茂,文字通畅。
(3)报告容应包括方案分析;方案对比;整体设计论述;硬件设计(电路接线,元器件说明,硬件资源分配);软件设计(软件流程,编程思想,程序注释,)调试结果;收获与体会;附录(设计代码放在附录部分,必须加上合理的注释)(4)学生签名:2015年1月16 日课程设计(论文)评审意见(1)总体方案的选择是否正确;正确()、较正确()、基本正确()(2)程序仿真能满足基本要求;满足()、较满足()、基本满足()(3)设计功能是否完善;完善()、较完善()、基本完善()(4)元器件选择是否合理;合理()、较合理()、基本合理()(5)动手实践能力;强()、较强()、一般()(6)学习态度;好()、良好()、一般()(7)基础知识掌握程度;好()、良好()、一般()(8)回答问题是否正确;正确()、较正确()、基本正确()、不正确()(9)程序代码是否具有创新性;全部()、部分()、无()(10)书写整洁、条理清楚、格式规;规()、较规()、一般()总评成绩优()、良()、中()、及格()、不及格()评阅人:年月日摘要随着社会科技的发展和进步,计算器因其功能强大而早已成为人们日常生活中必不可少的工具,最简单的计算器就能实现简单的加减乘除运算,这让人们免去了复杂的计算过程,大大提高了工作效率。
汇编课程设计(有符号多位十进制数的四则运算计算器)

汇编语言课程设计实验报告一、课程设计目的《汇编语言程序设计》是计算机专业一门重要的核心课程,也是一门实践性很强的课程,而课程设计则是其中一个重要的应用实践环节。
本次课程设计的目的是提高分析问题、解决问题的能力以及实际动手能力,进一步加深对汇编语言程序设计基本理论的理解,熟练掌握汇编语言程序上机调试的方法技巧、结构化程序设计技术及高级汇编语言技术,能编写较复杂的应用程序,为学习后继课程打下扎实的基础二、实验环境编译机器:IBM兼容PC操作系统:Windows XP -SP2 中文版编译工具:MASM 5.0三、课程设计内容1、编写一个有符号多位十进制数的四则运算计算器程序,所输入的算式如下例所示:-278+32=-132――12=11*-32=-1234/-18=要求程序能接收键入的算式,在接收到‘=’号时,计算并以有符号十进制数的形式显示结果,然后允许用户继续键入算式。
如果键入算式后再键入‘.’,则显示结果并结束整个程序。
(‘/’为整除)程序设计框图:程序源代码:2、已知一个由英语单词组成的字符串已按字典序排好,每个单词以空格符为结束,该串的首二字节为16位无符号二进制数,用以说明串的长度。
试编程能从键盘上输入单词(以空格字符为结束),若字符串中没有该单词,则将该单词插入该串适当的位置,使其仍保持字典序,并修改串长度,显示单词在串中位置及串长度;若字符串中有该单词,则显示字符串中所有包含该单词的单词,及其在字符串中的位置。
程序设计框图:程序代码:DATA SEGMENT; DICTIONARY 字典字符串,首两个字节为 16 位无符号二进制数,说明字符串长度。
DICTIONARY DB 00,16H,"add an book dad egg "DB 100H DUP(20H) ; 空的缓冲区。
MSG_INTRO DB "Input the Word to Search : ","$"MSG_NOTFOUND DB "Not Found, Now Insert it . ",0AH,0DH,"$"MSG_NEWDICT DB 0AH,0DH,"New Dictionary : ","$"MSG_FOUND DB 0AH,0DH,"Found Word in Dictionary : ","$"MSG_POSITION DB 0AH,0DH,"Position : ","$"MSG_DICTLENGTH D B 0AH,0DH,"New Dictionary Length : ","$"MSG_NEWLINE DB 0AH,0DH,"$"BUFFER DB 10H DUP(20H) ; BUFFER 用于保存需要查询的单词。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
十进制四则运算计算器的设计与实现1.问题描述(1)题目描述:在以二叉树表示算术表达式的基础上,设计一个十进制的四则运算计算器。
(2)基本要求:实现整数或浮点数的四则运算。
(3)测试数据:12 - ( - 4 ) * ( ( 20 + 3 / 5 ) * 8 / 5 ) * ( - 4 ) #=-515.36- ( 22.7 - 4208.3 ) / ( ( 2.4 + 1.6 ) * 12 ) + 4.4 - 2.9 #=88.710 - ( - 3 ) * ( ( 21 + 3 / 5 ) * 8 / 3 ) * ( - 2 ) #=-335.62.需求分析(1)程序实现的功能是从键盘输入有效的表达式,求出其值并输出(2)程序运行后,会提示用户输入表达式,并判断是否有效,并返回值3.概要设计为了实现程序功能,用二叉树存储表达式,然后从二叉树按后序遍历的方式取出数据,进行运算,运算时用堆栈存储数据。
(1)二叉链表的定义ADT BinaryTree{//数据对象D:D是具有相同特性的数据元素的集合。
//数据关系R:// 若D=Φ,则R=Φ,称BinaryTree为空二叉树;// 若D≠Φ,则R={H},H是如下二元关系;// (1)在D中存在惟一的称为根的数据元素root,它在关系H下无前驱;// (2)若D-{root}≠Φ,则存在D-{root}={D1,Dr},且D1∩Dr =Φ;// (3)若D1≠Φ,则D1中存在惟一的元素x1,<root,x1>∈H,且存在D1上的关系H1 ?H;若Dr≠Φ,则Dr中存在惟一的元素xr,<root,xr>∈H,且存在上的关系Hr ?H;H={<root,x1>,<root,xr>,H1,Hr};// (4)(D1,{H1})是一棵符合本定义的二叉树,称为根的左子树;(Dr,{Hr})是一棵符合本定义的二叉树,称为根的右子树。
//基本操作:InitBiTree( &T )//操作结果:构造空二叉树T。
DestroyBiTree( &T )// 初始条件:二叉树T已存在。
// 操作结果:销毁二叉树T。
CreateBiTree( &T, definition )// 初始条件:definition给出二叉树T的定义。
// 操作结果:按definiton构造二叉树T。
ClearBiTree( &T )// 初始条件:二叉树T存在。
// 操作结果:将二叉树T清为空树。
BiTreeEmpty( T )// 初始条件:二叉树T存在。
// 操作结果:若T为空二叉树,则返回TRUE,否则返回FALSE。
BiTreeDepth( T )// 初始条件:二叉树T存在。
// 操作结果:返回T的深度。
Root( T )// 初始条件:二叉树T存在。
// 操作结果:返回T的根。
Value( T, e )// 初始条件:二叉树T存在,e是T中某个结点。
// 操作结果:返回e的值。
Assign( T, &e, value )// 初始条件:二叉树T存在,e是T中某个结点。
// 操作结果:结点e赋值为value。
Parent( T, e )// 初始条件:二叉树T存在,e是T中某个结点。
// 操作结果:若e是T的非根结点,则返回它的双亲,否则返回“空”。
LeftChild( T, e )// 初始条件:二叉树T存在,e是T中某个结点。
// 操作结果:返回e的左孩子。
若e无左孩子,则返回“空”。
RightChild( T, e )// 初始条件:二叉树T存在,e是T中某个结点。
// 操作结果:返回e的右孩子。
若e无右孩子,则返回“空”。
LeftSibling( T, e )// 初始条件:二叉树T存在,e是T中某个结点。
// 操作结果:返回e的左兄弟。
若e是T的左孩子或无左兄弟,则返回“空”。
RightSibling( T, e )// 初始条件:二叉树T存在,e是T中某个结点。
// 操作结果:返回e的右兄弟。
若e是T的右孩子或无右兄弟,则返回“空”。
InsertChild( T, p, LR, c )// 初始条件:二叉树T存在,p指向T中某个结点,LR为0或1,非空二叉树c与T不相交且右子树为空。
// 操作结果:根据LR为0或1,插入c为T中p所指结点的左或右子树。
p所指结点的原有左或右子树则成为c的右子树。
DeleteChild( T, p, LR )// 初始条件:二叉树T存在,p指向T中某个结点,LR为0或1。
// 操作结果:根据LR为0或1,删除T中p所指结点的左或右子树。
PreOrderTraverse( T, visit() )// 初始条件:二叉树T存在,Visit是对结点操作的应用函数。
// 操作结果:先序遍历T,对每个结点调用函数Visit一次且仅一次。
一旦visit()失败,则操作失败。
InOrderTraverse( T, visit() )// 初始条件:二叉树T存在,Visit是对结点操作的应用函数。
// 操作结果:中序遍历T,对每个结点调用函数Visit一次且仅一次。
一旦visit()失败,则操作失败。
PostOrderTraverse( T, visit() )// 初始条件:二叉树T存在,Visit是对结点操作的应用函数。
// 操作结果:后序遍历T,对每个结点调用函数Visit一次且仅一次。
一旦visit()失败,则操作失败。
LevelOrderTraverse( T, visit() )// 初始条件:二叉树T存在,Visit是对结点操作的应用函数。
// 操作结果:层次遍历T,对每个结点调用函数Visit一次且仅一次。
一旦visit()失败,则操作失败。
(2)本程序包含的模块判断表达式主函数模块创建二叉树计算结果、输出4.详细设计(1)二叉树的二叉链表类型定义typedef struct BitNode{ElemType data;struct BitNode *Lchild,*Rchild;//二叉树的左右孩子和父母} BitNode;typedef BitNode *BitTree;(2)树的结构定义class binarytree//树的类{public:BinNode *root; //根节点binarytree(void){root=NULL;} //构造函数void print(void){print(root);}void print(BinNode *p){if(p!=NULL){print(p->left_child);print(p->right_child);cout<<p->data<<" ";}}void evaluate(void){evaluate(root);}bool evaluate(BinNode *prt) //计算二叉树一个节点{if(IsOperator(prt->data)&&!IsOperator(prt->left_child->data)&&!IsOperator(prt->right_chil d->data))//计算二叉树结点的值并存入新的二叉树结点{float num=0;float num1=atof(prt->left_child->data.c_str());float num2=atof(prt->right_child->data.c_str());if(prt->data=="+")num=num1+num2;else if(prt->data=="-")num=num1-num2;else if(prt->data=="*")num=num1*num2;else if(prt->data=="/"){if(num2==0.0){cout<<"除数为零运算出错";return 0;}elsenum=num1/num2;}else if(prt->data=="^")num=pow(num1,num2);else if(prt->data=="%"){if(num2==0.0){cout<<"除数为零运算出错";return 0;}elsenum=(long)num1%(long)num2;}stringstream bob;bob<<num;string suzzy(bob.str());prt->data=suzzy;prt->left_child=NULL;prt->right_child=NULL;}else if(prt->left_child==NULL&&prt->right_child==NULL);else{evaluate(prt->left_child);evaluate(prt->right_child);evaluate(prt);}return 1;}void clear_help(void){clear_help(root);}void clear_help(BinNode *rt){if(rt!=NULL){clear_help(rt->left_child);clear_help(rt->right_child);delete rt;}}}判断表达式是否正确bool judge(string exp) //判断输入是否正确{char check;int error=0,lb=0,rb=0,numofoperand=0,numofoperator=0;for(int m=0;m<exp.size();m++){check=exp[m];if(IsOperand(check)){if(check=='.')//判断浮点型数据是否正确{if(!(exp[m-1]>='0'&&exp[m-1]<='9')&&(exp[m+1]>='0'&&exp[m+1]<='9')){error++;cout<<"浮点型数据输入有误"<<endl;}}numofoperand++;}else if(IsOperator(check)){if(check==')'){rb++;if(rb>lb){error++;cout<<"右括号不可能大于左括号"<<endl;}if(IsOperator(exp[m+1])&&(exp[m+1]=='+'||exp[m+1]=='-'||exp[m+1]=='*'||exp[m+1]=='/'||e xp[m+1]==')')){numofoperator++;m++;if(exp[m]==')')rb++;}else if(IsOperator(exp[m+1])||IsOperand(exp[m+1])){error++;cout<<"右括号后不可能直接跟数据或左括号"<<endl;}}else if(check=='('){lb++;if(IsOperator(exp[m+1])&&exp[m+1]=='('||exp[m+1]=='-')//左括号右边只能是数字或者"-"号{m++;m++;lb++;}else if(IsOperator(exp[m+1])){error++;cout<<"左括号后运算符只能跟左括号"<<endl;}}else{numofoperator++;if(IsOperator(exp[m+1])&&exp[m+1]=='('){m++;lb++;}else if(IsOperator(exp[m+1])){error++;cout<<"非括号的运算符不能直接接非括号运算符"<<endl;}}}else{error++;cout<<check<<"为非法字符"<<endl;}}if((error==0)&&(lb==rb)&&(numofoperand!=0)&&(numofoperator!=0))return true;elsereturn false;}5.调试分析(1)程序将所有的二叉树的子树用binarytree进行创建子树,然后将子树的孩子结点和数据域进行计算,存入上一层树的孩子结点中,从而使算术比较节约时间。