程序设计实训报告—表达式求值问题
《程序设计方法学》实验报告-算术表达式求值
X X X X X大学《程序设计方法学》实验报告实验一:算术表达式求值学院:X X X专业:计算机科学与技术姓名:X X X学号:XXXXX2010年11 月18 日目录1.前言 (1)2.概要设计 (1)2.1 数据结构设计 (1)2.2 算法设计 (1)2.3 ADT描述 (2)2.4 功能模块分析 (3)3.详细设计 (3)3.1 数据存储结构设计 (3)3.2主要算法流程图(或算法伪代码) (4)4.测试结果 (7)5.参考文献 (8)附录--程序源代码 (8)1.前言在计算机中,算术表达式由常量、变量、运算符和括号组成。
由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。
因而在程序设计时,借助栈实现。
算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。
为简化,规定操作数只能为正整数,操作符为+、-*、/,用#表示结束。
算法输出:表达式运算结果。
算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。
在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。
2.概要设计2.1 数据结构设计任何一个表达式都是由操作符,运算符和界限符组成的。
我们分别用顺序栈来寄存表达式的操作数和运算符。
栈是限定于紧仅在表尾进行插入或删除操作的线性表。
顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,base为栈底指针,在顺序栈中,它始终指向栈底,即top=base可作为栈空的标记,每当插入新的栈顶元素时,指针top增1,删除栈顶元素时,指针top减1。
2.2 算法设计为了实现算符优先算法。
可以使用两个工作栈。
一个称为OPTR,用以寄存运算符,另一个称做OPND,用以寄存操作数或运算结果。
1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素;2.依次读入表达式,若是操作符即进OPND栈,若是运算符则和OPTR栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为”#”)。
数据结构实验报告 表达式求值
(一) 需求分析1、输入的形式和输入值的范围:根据题目要求与提示,先选择你要使用的表达式形式(中缀用1,后缀用0),在输入一个中缀表达式,输入数的范围为int型,此时,程序将计算出表达式的结果。
2、输出的形式:当按照程序要求选择了1或0之后,再输入表达式;如果选择的是1,则程序将自动运算出表达式结果;如果之前选择的是0,则程序将现将中缀表达式转化为后缀表达式并计算出结果。
3、程序所能达到的功能:本程序能计算出含+、-、*、/、(、)等运算符的简单运算。
4、测试数据:输入一个表达式,如果你之前选择的是“中缀表达式”,那么输入5*(4-2)#,那么输出结果是10;如果之前选择的是“后缀表达式”,那么输入5*(4-2)#,那么他将先转换成后缀表达式5 4 2 - * #,再输出结果10。
如果输入表达式没有结束标示符#,如5*(4-2),那将不会输出任何结果,或出现错误结果。
(二) 概要设计为了实现上述操作,应以栈为存储结构。
1.基本操作:(1). int GetTop(SqStack *s)初始条件:栈存在;操作结果:若栈为空,则返回s的栈顶元素;否则返回ERROR。
(2).void Push(SqStack *s,int e)初始条件:栈存在;操作结果:插入e为新的栈顶元素。
(3).int Pop(SqStack *s)初始条件:栈存在;操作结果:若栈不空,则删除之,并返回其值;否则返回REEOR。
(4).void InitStack(SqStack *s)初始条件:栈存在;操作结果:置栈为空。
(5).int Empty(SqStack *s)初始条件:栈存在;操作结果:判定s是否为空栈。
(6).int Operate(int a,char theta, int b)初始条件:操作数a和b存在,且theta是+、-、*、/四则运算;操作结果:返回a与b间theta运算的结果。
(7).int In(char s,char* TestOp)初始条件:s为待判断字符,TestOp为已知的算符集合;操作结果:s为算符集合中的元素则返回1,否则返回0.(8).int ReturnOpOrd(char op,char* TestOp)初始条件:op为待确定运算符,TestOp为已知的算符集合;操作结果:确定运算符类型。
数据结构表达式求值实验报告
数据结构表达式求值实验报告数据结构表达式求值实验报告第一章引言数据结构是计算机科学中重要的基础知识之一,它研究的是数据在计算机中的存储和组织方式,以及基于这些方式进行操作和运算的算法。
表达式求值是数据结构中一个重要的应用场景,它涉及到从一个给定的表达式中计算出最终结果的过程。
本实验旨在通过实际编程实践,掌握表达式求值的算法和数据结构的应用。
第二章实验目的1.理解表达式的概念。
2.熟悉常见表达式求值算法。
3.掌握栈的基本操作。
4.实现一个表达式求值的程序。
第三章实验内容1.表达式的定义:________表达式是由运算符和运算数组成的字符串,它代表了一种计算规则。
2.表达式的分类:________根据运算符的位置和计算顺序,表达式可以分为前缀表达式、中缀表达式和后缀表达式。
3.表达式求值的算法:________1. 前缀表达式求值算法:________1) 创建一个空栈。
2) 从右往左遍历前缀表达式。
3) 如果当前字符是运算符,则将栈顶的两个元素出栈,进行相应的运算,将结果入栈。
4) 如果当前字符是运算数,则将其转化为整数形式,并入栈。
5) 最终栈内只剩下一个元素,即为表达式的求值结果。
2. 中缀表达式求值算法:________1) 将中缀表达式转化为后缀表达式。
2) 创建一个空栈。
3) 从左往右遍历后缀表达式。
4) 如果当前字符是运算符,则将栈顶的两个元素出栈,进行相应的运算,将结果入栈。
5) 如果当前字符是运算数,则将其转化为整数形式,并入栈。
6) 最终栈内只剩下一个元素,即为表达式的求值结果。
3. 后缀表达式求值算法:________1) 创建一个空栈。
2) 从左往右遍历后缀表达式。
3) 如果当前字符是运算符,则将栈顶的两个元素出栈,进行相应的运算,将结果入栈。
4) 如果当前字符是运算数,则将其转化为整数形式,并入栈。
5) 最终栈内只剩下一个元素,即为表达式的求值结果。
4.实验代码实现:________根据算法描述,使用编程语言实现一个表达式求值的程序。
数据结构课程设计-表达式求值【完整版】
XXXXXX大学《数据结构》课程设计报告班级:学号:姓名:指导老师:目录一算术表达式求值一、需求分析二、程序得主要功能三、程序运行平台四、数据结构五、算法及时间复杂度六、测试用例七、程序源代码二感想体会与总结算术表达式求值一、需求分析一个算术表达式就是由操作数(operand)、运算符(operator)与界限符(delimiter)组成得。
假设操作数就是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号与表达式起始、结束符“#”,如:#(7+15)*(23—28/4)#。
引入表达式起始、结束符就是为了方便.编程利用“算符优先法”求算术表达式得值.二、程序得主要功能(1)从键盘读入一个合法得算术表达式,输出正确得结果。
(2)显示输入序列与栈得变化过程。
三、程序运行平台Visual C++6、0版本四、数据结构本程序得数据结构为栈。
(1)运算符栈部分:struct SqStack //定义栈{char *base; //栈底指针char *top; //栈顶指针intstacksize; //栈得长度};intInitStack (SqStack &s) //建立一个空栈S{if (!(s、base= (char *)malloc(50*sizeof(char))))exit(0);s、top=s、base;s、stacksize=50;return OK;}char GetTop(SqStack s,char &e) //运算符取栈顶元素{if (s、top==s、base) //栈为空得时候返回ERROR{ﻩ printf("运算符栈为空!\n");ﻩ return ERROR;}elsee=*(s、top-1); //栈不为空得时候用e做返回值,返回S得栈顶元素,并返回OK returnOK;}int Push(SqStack&s,char e) //运算符入栈{if (s、top—s、base >= s、stacksize)ﻩ{printf("运算符栈满!\n");ﻩs、base=(char*)realloc(s、base,(s、stacksize+5)*sizeof(char));//栈满得时候,追加5个存储空间if(!s、base)exit (OVERFLOW);s、top=s、base+s、stacksize;s、stacksize+=5;}ﻩ*(s、top)++=e;//把e入栈ﻩreturn OK;}int Pop(SqStack &s,char &e) //运算符出栈{if (s、top==s、base) //栈为空栈得时候,返回ERROR{printf("运算符栈为空!\n”);ﻩ return ERROR;}else{ﻩﻩe=*-—s、top;//栈不为空得时候用e做返回值,删除S得栈顶元素,并返回OK return OK;}}int StackTraverse(SqStack&s)//运算符栈得遍历{ﻩchar *t;ﻩt=s、base;ﻩif (s、top==s、base){ﻩ printf(”运算符栈为空!\n”); //栈为空栈得时候返回ERRORreturn ERROR;}while(t!=s、top){ﻩﻩprintf(" %c",*t); //栈不为空得时候依次取出栈内元素t++;ﻩ}return ERROR;}(2)数字栈部分:struct SqStackn//定义数栈{int *base; //栈底指针int*top; //栈顶指针int stacksize; //栈得长度};intInitStackn (SqStackn &s) //建立一个空栈S{s、base=(int*)malloc(50*sizeof(int));if(!s、base)exit(OVERFLOW);//存储分配失败s、top=s、base;s、stacksize=50;return OK;}int GetTopn(SqStackn s,int&e) //数栈取栈顶元素{if(s、top==s、base){printf("运算数栈为空!\n");//栈为空得时候返回ERRORﻩ return ERROR;}elseﻩe=*(s、top-1);//栈不为空得时候,用e作返回值,返回S得栈顶元素,并返回OKreturnOK;}int Pushn(SqStackn &s,int e) //数栈入栈{if(s、top—s、base>=s、stacksize){ﻩﻩprintf("运算数栈满!\n");//栈满得时候,追加5个存储空间ﻩs、base=(int*)realloc (s、base,(s、stacksize+5)*sizeof(int));if(!s、base) exit (OVERFLOW);ﻩs、top=s、base+s、stacksize;//插入元素e为新得栈顶元素s、stacksize+=5;}*(s、top)++=e; //栈顶指针变化returnOK;}int Popn(SqStackn &s,int &e)//数栈出栈{ﻩif (s、top==s、base){ﻩ printf("运算符栈为空!\n");//栈为空栈得视时候,返回ERRORﻩ return ERROR;ﻩ}else{ﻩﻩe=*—-s、top;//栈不空得时候,则删除S得栈顶元素,用e返回其值,并返回OK ﻩreturnOK;}}int StackTraversen(SqStackn &s)//数栈遍历{ﻩint*t;ﻩt=s、base ;ﻩif(s、top==s、base)ﻩ{printf("运算数栈为空!\n”);//栈为空栈得时候返回ERRORﻩ return ERROR;ﻩ}ﻩwhile(t!=s、top)ﻩ{printf(” %d”,*t); //栈不为空得时候依次输出t++;}return ERROR;}五、算法及时间复杂度1、算法:建立两个不同类型得空栈,先把一个‘#’压入运算符栈。
数据结构表达式求值(中缀)实验报告
数据结构表达式求值(中缀)实验报告题目名称表达式求值学号姓名指导教师日期一1. 问题描述:在计算机中,算术表达式由常量、变量、运算符和括号组成。
由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行,在程序设计时,借助栈实现。
2. 表达式求值这个程序,主要利用栈和数组,把运算的先后步骤进行分析并实现简单的运算,以字符列的形式从终端输入语法的正确的、不含变量的整数表达式。
利用已知的算符优先关系,实现对算术四则运算的求值,在求值中运用栈、运算栈、输入字符和主要操作的变化过程。
该程序相当于一个简单的计算机计算程序,只进行简单的加减乘除和带括号的四则运算。
1、基本思想(中缀表达式求值)要把一个表达式翻译成正确求值的一个机器指令序列,或者直接对表达式求值,首先要能够正确解释表达式,要了解算术四则运算的规则即:(1)先乘除后加减;(2)从左到右计算;(3)先括号内,后括号外。
下表定义的运算符之间的关系:b + - * / () # a+ > > < < < > > _ > > < < < > > * > > > > < > > / > > > > < > > ( < < < < < = ) > > > > > > # < < < < < =为了实现运算符有限算法,在程序中使用了两个工作栈。
分别是:运算符栈OPTR,操作数栈OPND.基本思想:(1)首先置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素;(2)依次读入表达式中每个字符,若是操作数则进OPND栈,若是运算符则和OPTR栈得栈顶运算符比较优先级后作相应操作。
程序设计实训报告—表达式求值问题
程序设计实训报告—表达式求值问题完成者:何炜班级:计科1501学号:完成日期:2016年7月14日星期四目录一、题目的内容及要求................................. 错误!未定义书签。
二、需求分析 ................................................ 错误!未定义书签。
三、概要设计 ................................................ 错误!未定义书签。
四、详细设计 ................................................ 错误!未定义书签。
五、源代码 .................................................... 错误!未定义书签。
六、运行结果及分析..................................... 错误!未定义书签。
七、收获及体会............................................. 错误!未定义书签。
一、题目的内容及要求求解形如(a+b)*((c+d)*e+f*h*g)的简单算术表达式的求值问题。
这种表达式只包括加、减、乘、除4种运算符。
为了实现表达式求值,可以首先读入原表达式(包括括号)并创建对应二叉树,其次对二叉树进行前序遍历、中序遍历、后续遍历(非递归),并输出逆波兰表达式,最后求解原表达式的值,同时对非法表达式格式能予以判断。
用二叉树的结构来存储表达式,后续遍历二叉树即可得到逆波兰表达式二、需求分析本程序能解决形如(a+b)*((c+d)*e+f*h*g)并以’#’作为结束标志的简单算术表达式的求值问题。
不仅能够求解出多位浮点数,而且能够对简单的非法表达式进行判断以避免程序异常退出。
三、概要设计1.用户输入中缀表达式2.程序将中缀表达式用二叉树的链式存储结构存储下来3.前序、中序遍历这颗二叉树,输出对应的前缀、中缀表达式4.后续遍历(非递归)这颗二叉树,并把遍历结果存储在顺序栈内,并输出后缀表达式5.对后缀表达式进行求值四、详细设计以下对概要设计进行详细的原理分析。
《数据结构课程设计》表达式求值实验报告
实验课程名称专业班级学生姓名学号指导教师20 至 20 学年第学期第至周算术表达式求值演示一、概述数据结构课程设计.要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面.加深对课程基本内容的理解。
同时.在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
在这次的课程设计中我选择的题目是算术表达式求值演示。
表达式计算是实现程序设计语言的基本问题之一.也是栈的应用的一个典型例子。
设计一个程序.演示用算符优先法对算术表达式求值的过程。
深入了解栈和队列的特性.以便在解决实际问题中灵活运用它们.同时加深对这种结构的理解和认识。
二、系统分析1.以字符列的形式从终端输入语法正确的、不含变量的整数表达式。
利用已知的算符优先关系.实现对算术四则混合运算表达式的求值.并仿照教科书的例子在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。
2.一般来说.计算机解决一个具体问题时.需要经过几个步骤:首先要从具体问题抽象出一个适当的数学模型.然后设计一个解决此数学模型的算法.最后编出程序.进行测试.调试直至得到想要的答案。
对于算术表达式这个程序.主要利用栈.把运算的先后步骤进行分析并实现简单的运算!为实现算符优先算法.可以使用两个栈.一个用以寄存运算符.另一个用以寄存操作数和运算结果。
3.演示程序是以用户于计算机的对话方式执行.这需要一个模块来完成使用者与计算机语言的转化。
4.程序执行时的命令:本程序为了使用具体.采用菜单式的方式来完成程序的演示.几乎不用输入什么特殊的命令.只需按提示输入表达式即可。
(要注意输入时格式.否者可能会引起一些错误)5. 测试数据。
三、概要设计一个算术表达式中除了括号、界限符外.还包括运算数据和运算符。
由于运算符有优先级别之差.所以一个表达式的运算不可能总是从左至右的循序执行。
每次操作的数据或运算符都是最近输入的.这与栈的特性相吻合.故本课程设计借助栈来实现按运算符的优先级完成表达式的求值计算。
数据结构表达式求值实验报告
数据结构表达式求值实验报告数据结构表达式求值实验报告⒈引言本实验旨在研究和实现数据结构中表达式求值的算法。
表达式求值是计算机科学中常见的问题,对于计算机程序的正确性和性能具有重要影响。
本报告将详细介绍实验设计、实验步骤、实验结果及分析,并对实验过程中遇到的问题进行讨论。
⒉实验设计⑴实验目的本实验的目的是实现一个可以对常见的算术表达式进行求值的算法,包括支持基本的加减乘除运算符和括号。
⑵实验环境●操作系统:Windows 10●开发语言:C++●开发工具:Visual Studio 2019⑶数据结构设计为了实现表达式求值的算法,我们需要设计适当的数据结构来存储和处理表达式。
本实验中,我们选择使用栈来实现表达式求值。
●表达式栈:用于存储操作数和运算符。
●运算符栈:用于存储运算符。
⑷算法设计表达式求值的算法可以分为以下几个步骤:●遍历表达式,逐个处理操作数和运算符:●如果是操作数,入表达式栈。
●如果是运算符,与运算符栈栈顶元素进行比较,根据优先级决定如何处理。
●当表达式遍历完成后,依次处理剩余的运算符。
●最终表达式栈中的元素即为求值结果。
⒊实验步骤⑴数据结构实现根据设计,我们首先实现表达式栈和运算符栈的数据结构,包括入栈、出栈等操作。
⑵表达式输入与预处理用户输入待求值的表达式,进行预处理,去除空格、验证表达式的合法性等。
⑶表达式求值算法实现根据前述的算法设计,实现表达式求值的算法,利用表达式栈和运算符栈来处理表达式。
⑷测试与结果分析对于不同的测试用例,进行表达式求值的测试,并分析结果的正确性和性能。
⒋实验结果与分析经过实验测试,我们得到了表达式求值的结果。
结果显示,我们的算法能够正确地求得表达式的值,而且性能良好。
⒌讨论与总结在实验过程中,我们遇到了一些问题,并进行了讨论和解决。
通过这个实验,我们更加深入地理解了表达式求值的算法,并对数据结构的应用有了更清晰的认识。
附件:无法律名词及注释:●无。
实验报告二--表达式求值
实验报告二表达式求值一、问题描述1.实验题目:表达式求值2.基本要求:输入一个算术表达式,输出其值。
3.测试数据:表达式为:1.5+(2-3)*2# (#表示结束)运行结果应为:-0.500000二、需求分析1. 本程序用来求任意一个由浮点型数据和加减乘除四则运算构成的简单算术表达式的值。
2. 用户根据程序运行后的提示信息输入算术表达式,运算符仅限+-*/,操作数仅限浮点数,表达式以#结尾表示结束。
3. 用户输入完毕后,程序自动输出运算结果。
三、设计核心算法:采用算符优先算法,使用两个工作栈,一个称为OPTR,用来存放运算符;另一个称为OPND,用来寄放操作数或运算结果。
算法的基本思想是:(1)首先置操作数为空栈,表达式起始符"#"为运算符栈的栈底元素;(2)依次读入表达式中的每个字符,若是操作数则进OPND栈,若是运算符则和OPTR栈的栈顶元素比较优先权后作相应操作,直至整个表达式求值完毕(输入为"#").四、测试结果五、附录//表达式求值#include <stdio.h>#include <stdlib.h>#include <string.h>#define error 0#define ok 1#define overflow -1#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define OPSETSIZE 7char OPSET[OPSETSIZE]={'+','-','*','/','(',')','#'}; unsigned char Prior[7][7] = { // 算符间的优先关系'>','>','<','<','<','>','>','>','>','<','<','<','>','>','>','>','>','>','<','>','>','>','>','>','>','<','>','>','<','<','<','<','<','=',' ','>','>','>','>',' ','>','>','<','<','<','<','<',' ','='};typedef int Status;template <typename T>struct SqStack{T *top;T *base;int stacksize;};//顺序栈结构模板template <typename T1,typename T2>Status InitStack(T1 &S){S.base=(T2 *)malloc(STACK_INIT_SIZE*sizeof(T2));if(!S.base) exit (overflow);S.top=S.base;S.stacksize=STACK_INIT_SIZE;return ok;}//初始化栈函数模板template <typename T1,typename T2>Status Push(T1 &S,T2 e){if(S.top-S.base>=S.stacksize){S.base=(T2 *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(T2));if(!S.base) exit (overflow);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return ok;}//入栈函数模板template <typename T1,typename T2>Status Pop(T1 &S,T2 &e){if(S.top==S.base) return error;e=*--S.top;return ok;}//出栈函数模板template <typename T1,typename T2>T2 GetTop(T1 S){if(S.top==S.base)return error;elsereturn *(S.top-1);}//获取栈顶元素模板Status In(char Test,char* TestOp) {bool Find=false;for (int i=0; i< OPSETSIZE; i++) {if (Test == TestOp[i]) Find= true;}return Find;}//判断是否为运算符float Operate(float a,unsigned char theta, float b) {switch(theta) {case '+': return a+b;case '-': return a-b;case '*': return a*b;case '/': return a/b;default : return 0;}}//运算int ReturnOpOrd(char op,char* TestOp) {int i;for(i=0; i< OPSETSIZE; i++) {if (op == TestOp[i]) return i;}return 0;}char precede(char Aop, char Bop) {return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];}//ReturnOpOrd和precede组合,判断运算符优先级float EvaluateExpression() {// 算术表达式求值的算符优先算法。
算术表达式求值实验报告
算术表达式求值实验报告1. 背景算术表达式求值是计算机科学中的基本问题之一,涉及到对数学表达式的解析和计算。
在计算机编程中,经常需要对用户输入的数学表达式进行求值,以得到正确的计算结果。
因此,研究如何高效地求解算术表达式是非常重要的。
在本次实验中,我们将探索不同方法来求解算术表达式,并比较它们的性能和准确性。
我们将使用Python语言作为实现工具,并通过编写代码来实现不同方法。
2. 分析2.1 表达式解析在进行表达式求值之前,我们首先需要对输入的数学表达式进行解析。
解析过程主要包括以下几个步骤:1.去除空格:将输入的字符串中的空格字符去除。
2.分词:将字符串按照运算符和操作数进行分割,得到一个由标记组成的列表。
3.构建语法树:根据分词结果构建一个语法树,用于表示数学表达式的结构。
4.求值:通过遍历语法树并执行相应操作,最终得到表达式的值。
2.2 求值方法在本次实验中,我们将尝试以下两种不同的求值方法:1.递归求值:通过递归地遍历语法树来求解表达式。
递归求值的优点是简单易懂,但可能存在性能问题。
2.栈求值:使用栈数据结构来辅助求解表达式。
栈可以有效地处理运算符的优先级和括号的匹配问题。
2.3 性能评估为了评估不同方法的性能,我们将使用一组测试用例来对其进行比较。
测试用例包括不同长度和复杂度的数学表达式,以及各种运算符和括号的组合。
我们将使用Python内置的time模块来测量每种方法的执行时间,并比较它们之间的差异。
此外,我们还将检查每种方法是否能正确地计算出表达式的结果。
3. 实验结果3.1 表达式解析在实现表达式解析过程时,我们首先去除输入字符串中的空格,并将其转换为一个字符列表。
然后,我们使用递归下降法来构建语法树。
具体而言,我们定义了以下几个函数:1.parse_expression(tokens):该函数接受一个标记列表作为参数,并返回一个表示整个表达式的语法树。
2.parse_term(tokens):该函数接受一个标记列表作为参数,并返回一个表示项的语法树。
表达式求值数据结构实训报告
数据结构实训总结报告题目:表达式求值学生姓名:学生学号:专业班级:指导老师:目录1.课题分析 .....................................................................1.1需求分析..............................................................1. 2设计要求............................................................2.总体设计.......................................................................2.1主程序的流程.....................................................3.详细设计(步骤及代码实现) ...................................3. 1判断运算符优先级..............................................3. 2中缀表达式转后缀表达式..................................3. 3后缀表达式求值.................................................. 4.测试结果 .................................................................... 5.心得体会 .................................................................... 6.参考文献 ....................................................................1.课题分析1.1需求分析(1)栈“后进先出”的特点。
数据结构课程设计-表达式求值问题
实验表达式求值问题1. 问题描述表达式是数据运算的基本形式。
人们的书写习惯是中缀式,如:11+22* (7-4 )/3. 中缀式的计算按运算符的优先级及括号优先的原则,相同级别从左到右进行计算。
表达式还有后缀表达式(如:11 22 7 4 - * 3 / + )和前缀表达式(+ 11 / * 22 - 7 4 3 )。
后缀表达式和前缀表达式中没有括号,给计算带来方便。
如后缀表达式计算时按运算符出现的先后进行计算。
本设计的主要任务是进行表达式形式的转换及不同形式的表达式计算。
2. 数据结构设计1)顺序栈类定义:首先应在类中定义成员函数,以此来完成顺序栈的相关操作,如下:class SqStackprivate:T *base; // 栈底指针int top; // 栈顶int stacksize; // 栈容量public:SqStack(int m); // 构建函数~SqStack(){delete [] base;top=0;stacksize=0;} // 析构函数void Push(T x); // 入栈T Pop(); // 出栈T GetTop(); // 获取栈顶元素int StackEmpty(); // 测栈空void ClearStack(); // 清空栈void StackTop(); // 返回栈顶指针void StackTranverse(); // 显示栈中元素};2)顺序栈类实现:对顺序栈进行初始化,初始化的首要操作就是创建一个空顺序栈。
Step1 :申请一组连续的内存空间为顺序栈使用:base=new T[m];i f(base==NULL)cout<<" 栈创建失败,退出!"<<endl; exit(1);}{Step2 :给栈顶、栈容量赋相应的值:stacksize=m;t op=-1;(2)顺序栈入栈:入栈需要在栈顶插入一个新元素并相应的调整栈顶。
数据结构课程设计报告-表达式求值
}
double Calculate(double a,double b,char c){ //进行二元运算
double result;
switch(c){
case '+':result=a+b;break;
case '-':result=a-b;break;
case '*':result=a*b;break;
void PushNum(OPND *OPND,double num){ //操作数进栈
OPND->top++;
OPND->array[OPND->top-1]=num;
}
void PopNum(OPND *OPND,double *num){ //操作数出栈
*num=OPND->array[OPND->top-1];
default:priority='E';
}
return priority;
}
void Process(OPND *OPND,OPTR *OPTR,char x){ //计算表达式
double a,b;char c;
static double tempnum=0.00000000;
static int len=10; //用于各数位上的值的转换
double array[N];
int top;//栈顶指针
}OPND;
typedef struct{ //定义运算符栈
char array[N];
int top;//栈顶指针
}OPTR;
int Cint(char mychar){ //将字符0-9转换成数值
表达式求值 实验报告
表达式求值实验报告表达式求值实验报告一、引言表达式求值是计算机科学中一个重要的概念,它涉及到对数学表达式的计算和求解。
在本次实验中,我们将探讨表达式求值的相关算法和实现方法,并通过编程实现一个简单的表达式求值器。
二、算法原理1. 表达式的表示方法在计算机中,我们通常使用字符串来表示表达式。
例如,一个简单的数学表达式"2 + 3 * 4"可以表示为字符串"2+3*4"。
在实现表达式求值的算法时,我们需要将字符串中的数字和运算符进行分离,以便进行后续的计算。
2. 中缀表达式转后缀表达式为了方便计算,我们通常将中缀表达式转换为后缀表达式。
后缀表达式也称为逆波兰表达式,它的特点是运算符位于操作数的后面。
例如,上述的中缀表达式"2+3*4"可以转换为后缀表达式"234*+"。
转换的方法可以通过使用栈来实现。
3. 后缀表达式求值得到后缀表达式后,我们可以通过扫描表达式并使用栈来求解。
当遇到操作数时,将其压入栈中;当遇到运算符时,从栈中弹出相应数量的操作数进行计算,并将结果压入栈中。
最终,栈中的唯一元素即为表达式的求值结果。
三、实验过程1. 数据结构设计为了实现表达式求值器,我们需要设计相应的数据结构。
在本次实验中,我们选择使用栈来存储操作数和运算符。
2. 中缀表达式转后缀表达式首先,我们需要编写一个函数来将中缀表达式转换为后缀表达式。
该函数的实现可以通过使用栈和遍历字符串来实现。
具体的步骤如下:- 创建一个空栈和一个空字符串用于存储后缀表达式。
- 从左到右遍历中缀表达式的每个字符。
- 如果遇到操作数,直接将其添加到后缀表达式字符串中。
- 如果遇到运算符,将其与栈顶的运算符进行比较:- 如果栈为空或栈顶为左括号"(",则直接将运算符入栈。
- 如果栈顶的运算符优先级低于当前运算符,则将当前运算符入栈。
- 如果栈顶的运算符优先级高于或等于当前运算符,则将栈顶的运算符弹出并添加到后缀表达式字符串中,直到栈顶的运算符优先级低于当前运算符或栈为空。
数据结构表达式求值实验报告
数据结构表达式求值实验报告一、实验目的本次实验的主要目的是通过实现表达式求值的程序,深入理解数据结构和算法在解决实际问题中的应用。
具体包括掌握栈这种数据结构的操作和使用,熟悉表达式的转换和计算过程,提高编程能力和问题解决能力。
二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。
三、实验原理表达式求值是程序设计中的一个常见问题,通常采用栈这种数据结构来实现。
表达式可以分为中缀表达式、后缀表达式和前缀表达式。
中缀表达式是我们日常使用的表达式形式,如“2 +3 4”,但直接对中缀表达式求值比较复杂。
而后缀表达式(如“2 3 4 +”)和前缀表达式(如“+2 3 4”)求值相对简单。
因此,在实现表达式求值时,通常先将中缀表达式转换为后缀表达式,然后对后缀表达式进行求值。
转换过程中,使用两个栈,一个用于存储操作数,另一个用于存储运算符。
求值过程中,根据后缀表达式的特点,从左到右依次处理操作数和运算符,进行相应的计算。
四、实验步骤1、定义数据结构定义栈类,用于存储操作数和运算符。
定义一个结构体来表示操作数和运算符。
2、中缀表达式转后缀表达式从左到右扫描中缀表达式。
遇到操作数,直接输出。
遇到运算符,根据其优先级与栈顶运算符的优先级进行比较,决定入栈或出栈操作。
3、后缀表达式求值从左到右扫描后缀表达式。
遇到操作数,入栈。
遇到运算符,从栈中取出两个操作数进行计算,将结果入栈。
4、主函数输入中缀表达式。
调用转换函数和求值函数,输出计算结果。
五、实验代码```cppinclude <iostream>include <stack>include <string>//定义操作符的优先级int priority(char op) {if (op =='+'|| op =='')return 1;if (op ==''|| op =='/')return 2;return 0;}//中缀表达式转后缀表达式std::string infixToPostfix(std::string infix) {std::stack<char> opStack;std::string postfix ="";for (char c : infix) {if (isdigit(c)){postfix += c;} else if (c =='('){} else if (c ==')'){while (!opStackempty()&& opStacktop()!='('){postfix += opStacktop();opStackpop();}opStackpop();//弹出'('} else {while (!opStackempty()&& priority(opStacktop())>=priority(c)){postfix += opStacktop();opStackpop();}opStackpush(c);}}while (!opStackempty()){postfix += opStacktop();}return postfix;}//后缀表达式求值int evaluatePostfix(std::string postfix) {std::stack<int> operandStack;for (char c : postfix) {if (isdigit(c)){operandStackpush(c '0');} else {int operand2 = operandStacktop();operandStackpop();int operand1 = operandStacktop();operandStackpop();switch (c) {case '+':operandStackpush(operand1 + operand2);break;case '':operandStackpush(operand1 operand2);break;case '':operandStackpush(operand1 operand2);break;case '/':operandStackpush(operand1 / operand2);break;}}}return operandStacktop();}int main(){std::string infixExpression;std::cout <<"请输入中缀表达式: ";std::cin >> infixExpression;std::string postfixExpression = infixToPostfix(infixExpression);int result = evaluatePostfix(postfixExpression);std::cout <<"表达式的计算结果为: "<< result << std::endl;return 0;}```六、实验结果输入不同的中缀表达式,如“2 +3 4”“( 2 + 3 )4”等,程序能够正确地将其转换为后缀表达式,并计算出结果。
数据结构表达式求值实验报告
竭诚为您提供优质文档/双击可除数据结构表达式求值实验报告篇一:数据结构实验二——算术表达式求值实验报告《数据结构与数据库》实验报告实验题目算术表达式求值学院:化学与材料科学学院专业班级:09级材料科学与工程系pb0920603姓学邮名:李维谷号:pb09206285箱:指导教师:贾伯琪实验时间:20XX年10月10日一、需要分析问题描述:表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。
设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。
问题分析:在计算机中,算术表达式由常量、变量、运算符和括号组成。
由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。
因而在程序设计时,借助栈实现。
设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。
在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。
在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。
算法规定:输入形式:一个(:数据结构表达式求值实验报告)算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。
为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。
输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。
程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。
测试数据:正确输入:12*(3.6/3+4^2-1)#输出结果:194.4无定义运算:12*(3.6/(2^2-4)+1)#输出结果:表达式出错,除数为0,无意义错误输入:12+s#输出结果:eRRoR!二、概要设计拟采用两种类型的展分别对操作数和操作符进行操作。
数据结构表达式求值实验报告
数据结构表达式求值实验报告关键信息项:1、实验目的:____________________________2、实验环境:____________________________3、实验原理:____________________________4、实验步骤:____________________________5、测试用例及结果:____________________________6、实验总结:____________________________11 实验目的本实验的主要目的是通过使用数据结构和算法来实现表达式求值的功能,加深对栈、队列等数据结构的理解和运用,提高编程能力和解决实际问题的能力。
111 具体目标包括掌握中缀表达式转换为后缀表达式的方法。
利用栈结构实现后缀表达式的求值运算。
能够处理表达式中的运算符优先级和括号。
12 实验环境本次实验使用的编程环境为具体编程语言和版本,在操作系统名称操作系统上进行。
121 所需软件和工具编程软件名称:用于编写和调试代码。
测试工具名称:用于对程序进行测试和验证。
13 实验原理表达式求值是程序设计中的一个常见问题。
中缀表达式符合人们的日常书写习惯,但直接求值较为复杂。
将中缀表达式转换为后缀表达式后,求值过程会变得更加简单和直观。
131 中缀转后缀表达式的原理遇到操作数,直接输出。
遇到运算符,将其与栈顶运算符进行优先级比较。
若优先级高于栈顶运算符,则入栈;否则,弹出栈顶运算符并输出,直到当前运算符优先级高于栈顶运算符或栈为空,然后将当前运算符入栈。
遇到左括号,直接入栈。
遇到右括号,弹出栈顶运算符并输出,直到遇到左括号,左括号出栈但不输出。
132 后缀表达式求值的原理从左到右扫描后缀表达式。
遇到操作数,压入栈中。
遇到运算符,从栈中弹出两个操作数,进行相应运算,将结果压入栈中。
扫描结束后,栈顶元素即为表达式的结果。
14 实验步骤141 数据结构设计定义一个栈来存储运算符。
算术表达式求值实习报告
算术表达式求值实习报告09040502班学号:052415 朱博凯一、需求分析(1)本程序需要用户自行输入表达式(运算符可以是加(+);减(-);乘(*);除(/);幂(^);括号(())),数字可以是整数也可以是浮点数,并按回车键结束!(2)程序功能:对算术表达式进行计算,输出结果,并输出其后缀表达式!(3)测试数据:8;1+2+3+4;88-1*3;1024/8*16;1024/(8*16);(22+3)*(8/2);3-3-3;8/(9-9);2*(5+3(2+4(3+6)))二、概要设计为实现上述程序功能,应以两个带头节点的栈分别存储表达式中的数和运算符。
1、栈的抽象数据类型定义ADT Stack{数据对象:d={ ai |ai∈elemset,i=1,2,3,......,n,n≥0}数据关系:r={<ai-1,ai,)>| ai-1,ai ∈d, i=2,3,......,n}约定a1为栈底,an 为栈顶。
基本操作:(1)InitStack(&S)操作结果:构造一个空栈S。
(2)DestroyStack(&S)初始条件:栈S已存在。
操作结果:销毁栈S。
(3)ClearStack(&S)初始条件:栈S已存在。
操作结果:将栈清空为空栈。
(4)StackEmpty(&S)初始条件:栈S已存在。
操作结果:若栈S为空栈,则返回TRUE,否则FALSE。
(5)StackLength(&S)初始条件:栈S已存在。
操作结果:返回栈的长度(或者说深度)。
(6)GetTop(S,&e)初始条件:栈S已存在且非空。
操作结果:用e返回S的栈顶元素。
(7)Push(&S,e)初始条件:栈S已存在。
操作结果:在栈顶插入新的元素e。
(8)Pop(&S,&e)初始条件:栈S已存在且非空。
操作结果:删除栈S的栈顶元素,并且用e返回它的值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序设计实训报告—表达式求值问题完成者:何炜班级:计科1501学号:完成日期:2016年7月14日星期四目录一、题目的内容及要求................................. 错误!未定义书签。
二、需求分析 ................................................ 错误!未定义书签。
三、概要设计 ................................................ 错误!未定义书签。
四、详细设计 ................................................ 错误!未定义书签。
五、源代码 .................................................... 错误!未定义书签。
六、运行结果及分析..................................... 错误!未定义书签。
七、收获及体会............................................. 错误!未定义书签。
一、题目的内容及要求求解形如(a+b)*((c+d)*e+f*h*g)的简单算术表达式的求值问题。
这种表达式只包括加、减、乘、除4种运算符。
为了实现表达式求值,可以首先读入原表达式(包括括号)并创建对应二叉树,其次对二叉树进行前序遍历、中序遍历、后续遍历(非递归),并输出逆波兰表达式,最后求解原表达式的值,同时对非法表达式格式能予以判断。
用二叉树的结构来存储表达式,后续遍历二叉树即可得到逆波兰表达式二、需求分析本程序能解决形如(a+b)*((c+d)*e+f*h*g)并以’#’作为结束标志的简单算术表达式的求值问题。
不仅能够求解出多位浮点数,而且能够对简单的非法表达式进行判断以避免程序异常退出。
三、概要设计1.用户输入中缀表达式2.程序将中缀表达式用二叉树的链式存储结构存储下来3.前序、中序遍历这颗二叉树,输出对应的前缀、中缀表达式4.后续遍历(非递归)这颗二叉树,并把遍历结果存储在顺序栈内,并输出后缀表达式5.对后缀表达式进行求值四、详细设计以下对概要设计进行详细的原理分析。
1、输入中缀表达式,并存在字符型数组里定义字符串char str[MAXSIZE];通过while(scanf("%s",str)!=EOF)来实现用户自定义结束程序的功能并通过strcmp("leave",str)==0 语句实现当用户输入“leave”,程序会正常退出。
2、以中缀表达式建立一棵二叉树定义二叉树的结构typedef struct BTNode{ElemType data[length];struct BTNode *lchild;struct BTNode *rchild;}BTNode;其中data[length];存储中缀表达式中的操作数或操作符。
整体原理:i.已知输入的str1=(a+b)*((c+d)*e+f*h*g);定义BTNode *st[MAXSIZE]节点栈,用来存储树的节点。
ii.再定义一个操作符栈char bt[MAXSIZE]存储操作符,去扫描字符串的每个位置,遇到数字就不做处理直接放到节点栈中,遇到操作符则将其与操作符栈顶元素比较优先级,决定是否送到节点栈中,以及决定该节点与其他节点的连接关系。
iii.最后BTNode* &b记录下树的根节点,便得到一颗二叉树了。
其中第一、第二步无需过多解释,以下详细解释第二步:①首先通过循环while(bt[top1]!='#'||*p!='#')来扫描字符串的每个位置的元素②如果字符串该位置为数字,就直接建立树的节点,并把节点放进节点栈中。
这里会遇到两种情况:一种是多位整数,一种是小数。
✓多位整形数:遇到第一位数字时,新建树的节点,存到data 数组里,用while(In(*p)==0)判断,将后面的几位数字也一起存到这个节点的data数组里,作为一个数字串整体。
✓带小数点的数:遇到第一位数字时,新建树的节点,存到data 数组里,如果下一位是’ . (小数点)’,则同样用while(In(*p)==0)判断,把小数点后面的数字连同前面的一起存到data数组里,作为一个数字串整体。
代码如下:if(In(*p)==0)//字符串该位置是操作数,则直接建立二叉树节点{s=(BTNode*)malloc(sizeof(BTNode));s->lchild=NULL;s->rchild=NULL;s->data[i]=*p;p++;i++;while(In(*p)==0){s->data[i]=*p;p++;i++;if(*p=='.')//如果是a.bc形式,则将a.bc一直存在节点中,直至后面不再是操作数为止{s->data[i]=*p;i++;p++;while(In(*p)==0){s->data[i]=*p;p++;i++;}}}s->data[i]='\0';top2++;st[top2]=s;//把该节点放入节点栈内}在此之前有一个判断是操作符还是操作数的判断函数,代码如下:int In(char c){if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#') return 1;//操作符else return 0;//操作数}③如果是操作符,则比较该操作符与操作符栈顶元素的优先级各符号的优先级表如下:其中’g’表示表达式错误。
a)如果当前操作符优先级> 操作符栈顶操作符优先级,则让操作符入操作符栈,然后检查字符串下一个位置b)如果当前操作符优先级<操作符栈顶操作符优先级,以操作符栈顶元素建立新的树节点并且取出节点栈顶的两个节点作为该节点的左右孩子节点,并把该节点压入节点栈。
c)如果当前操作符优先级= 操作符栈顶操作符优先级,此时,栈顶和当前操作符为左右括号,此时,出操作符栈顶元素,检查字符串中的下一个元素d)如果返回得到g,即反映了表达式错误,令全局变量error=999,以便在主函数中控制不输出结果。
3、前序、中序遍历这颗二叉树,并输出前缀、中缀表达式这两种遍历采用递归方式。
这种方式很简单。
每次访问节点的时候,把节点存在相应表达式数组里,以便输出。
4、后序遍历(非递归)二叉树,并把遍历结果存在字符型指针数组里,并输出后缀表达式非递归后续遍历的思想:采用一个顺序栈才存储需要返回的节点BTNode *St[MAXSIZE];,先扫描根节点所有左孩子节点,并把之前经过的节点一一进栈,到了最后,出栈一个节点,即为父亲节点,再扫描该节点的右孩子节点的左孩子节点,并把之前经过的节点一一进栈。
当一个节点的左右孩子节点均访问后再访问该父亲节点,直至栈空为止。
当访问该节点的时候,就把该节点数值存放到字符型指针数组里,并输出该值。
5、通过后缀表达式求出表达式的值因为本程序能解决简单的二目运算符的运算,所以定义double opnd1,opnd2作为运算符的两个元素,定义double opnd 作为运算结果。
定义一个数栈double St[MAXSIZE]来存放后缀表达式结果。
依次扫描后缀表达式(即postexp[n]数组)i.如果是数字,同上面建立二叉树一样,分为两种:多位整数和小数,我们通过循环for(j=0;j<r;j++)(其中r为数字串的长度),只要发现有小数点,就让flag=1;以此分辨两种情况,并定义k,统计小数点后面的位数,以便在还原小数的值的时候乘以相应的数量级即可!还原数字串原本的数值,再讲数值压入到数栈内。
ii.如果是符号,就把数栈内的两个数字取出来(top--)赋值给opnd1, opnd2.计算出结果,再压入数栈。
通过while (i<n)控制循环条件,最后St[0]即为表达式的结果。
五、源代码#include <stdio.h>#include <malloc.h>#include <string.h>#include <math.h>/*定义区*/#define MAXSIZE 256#define length 200#define ElemType charint error=0;//二叉树的链式存储结构typedef struct BTNode{ElemType data[length];struct BTNode *lchild;struct BTNode *rchild;}BTNode;//判断是操作符还是操作数int In(char c){if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#') return 1;//操作符else return 0;//操作数}//判断操作符的优先级char Precede(char a,char b){char r;switch(a){case '+':case '-':if(b=='*'||b=='/'||b=='(') r='<';else r='>';break; //加减比乘除和左括号的优先级低case '*':case'/':if(b=='(')r='<';else r='>';break;//乘除比左括号的优先级低case'(':if(b==')')//左右括号的优先级相同r='=';else if(b=='#'){printf("表达式错误\n");r='g';}else r='<';//除此之外,左括号比其他符号优先级低break;case')':if(b=='('){printf("表达式错误\n");r='g';}else r='>';//右括号比其他符号优先级高break;case'#':if(b==')'){printf("表达式错误\n");r='g';}else if(b=='#')r='=';else r='<'; //#比其他的符号优先级低break;}return r;}//将中缀表达式建立一棵二叉树int ExpBTree(BTNode* &b,char *str){int i;BTNode *st[MAXSIZE];//节点栈BTNode *s;//新建节点指针char bt[MAXSIZE];//操作符栈char *p;//字符串int top1= -1;//操作符栈指针int top2= -1;//节点栈指针p=str;top1++;bt[top1]='#';while(bt[top1]!='#'||*p!='#')//当且仅当操作符栈顶元素为'#'且字符串该位置为'#'时退出循环{i=0;if(In(*p)==0)//字符串该位置是操作数,则直接建立二叉树节点{s=(BTNode*)malloc(sizeof(BTNode));s->lchild=NULL;s->rchild=NULL;s->data[i]=*p;p++;i++;while(In(*p)==0){s->data[i]=*p;p++;i++;if(*p=='.')//如果是a.bc形式,则将a.bc一直存在节点中,直至后面不再是操作数为止{s->data[i]=*p;i++;p++;while(In(*p)==0)//当下一个位置是操作符,就存储到节点数组中{s->data[i]=*p;i++;}}}s->data[i]='\0';top2++;st[top2]=s;//把该节点放入节点栈内}else //字符串该位置是操作符,比较该操作符和操作符栈顶元素的优先级{switch(Precede(bt[top1],*p)){case '<':top1++;bt[top1]=*p;p++;break;//如果当前操作符优先级> 栈顶操作符优先级,则让操作符入操作符栈case '>':s=(BTNode*)malloc(sizeof(BTNode));s->data[i]=bt[top1];i++;s->data[i]='\0';top1--;s->rchild=st[top2];top2--;s->lchild=st[top2];st[top2]=s;break;//如果当前操作符优先级< 栈顶操作符优先级,以操作符栈顶元素建立新的树节点并且取出节点栈顶的两个节点作为该节点的左右孩子节点,并把该节点压入节点栈。