数据结构算术表达式求值实验报告
算术表达式求值-数据结构实验报告
//存放运算数的栈的顺序存储表示
//存放运算符的栈的顺序存储表示
void InitStack(SqStack *S) //构造空栈(运算数 栈) { S->base=(float*)malloc((STACK_INIT_SIZE)*sizeof(float)); S->top=S->base; S->stacksize=STACK_INIT_SIZE; } void initStack(sqStack *S) //构造空栈(运算符 栈) { S->base=(char*)malloc((STACK_INIT_SIZE)*sizeof(char)); S->top=S->base; S->stacksize=STACK_INIT_SIZE; } float GetTop(SqStack *S) //用e返回栈顶元素(运
初始条件:a, b为整数,OP为运算符。 操作结果:a与b进行运算,OP为二元运算符,返回其值。 }ADT Stack (2)符号之间的优先权关系比较 <:的优先权低于: =:的优先权等于 >:的优先权高于 + + * / ( ) # > > > > < > < > > > > < > < * < < > > < > < / < < > > < > < < ( < < < < < ) > > > > = > > = # > > > >
//用e返回栈顶元素
数据结构表达式求值实验报告
竭诚为您提供优质文档/双击可除数据结构表达式求值实验报告篇一:数据结构实验二——算术表达式求值实验报告《数据结构与数据库》实验报告实验题目算术表达式求值学院:化学与材料科学学院专业班级: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!二、概要设计拟采用两种类型的展分别对操作数和操作符进行操作。
数据结构表达式求值实验报告
实验报告课程名:数据结构(C语言版)实验名:表达式求值姓名:班级:学号:时间:2014.10.25一实验目的与要求1. 了解栈的应用2. 利用栈进行算术表达式求值二实验内容1.以字符串的形式给出一个算术表达式, 计算出该算术表达式的值。
2.表达式中可能出现”+”, ”−”, ”∗”, ”/”, ”(”, ”)”。
三实验结果与分析分析:r:读入字符t:栈顶字符r( ) # 低优先运算符高优先运算符( 入栈出栈错误入栈入栈) 错误错误错误错误错误t # 入栈错误结束入栈入栈低优先运算符入栈出栈+运算出栈+计算出栈+计算入栈高优先运算符入栈出栈+运算出栈+计算出栈+计算出栈+计算1, 入栈2, 错误3, 出栈4, 出栈+计算5, 结束( ) # 低优先运算符高优先运算符( 1 3 2 1 1) 2 2 2 2 2# 1 2 5 1 1低优先运算符 1 4 4 4 1高优先运算符 1 4 4 4 4此实验可用两个栈和数组来实现,一个操作栈,一个数字栈,两个栈的字符进行优先权比较可得到5种结果。
首先置操作栈为空栈,表达式起始符“#”作为数字栈的栈底元素,依次读入表达式的每个字符,若是操作字符进操作栈,若是数字进数字栈,操作栈和数字栈的栈顶元素比较优先权后进行相应操作,直至结束,最后输出值即可。
实验程序:#include<stdio.h>#include<stdlib.h>#include<string.h>int change(char c)//字符转换{int j=-1;switch(c){case '(':j=0;break;case ')':j=1;break;case '#':j=2;break;case '+':j=3;break;case '-':j=3;break;case '*':j=4;break;case '/':j=4;break;}return(j);}int compu(int x,int y,char c)//数字计算转换{int j=-1;switch(c){case '+':j=x+y;break;case '-':j=x-y;break;case '*':j=x*y;break;case '/':j=x/y;break;}return(j);}void get(char a[],int num_op,int method[5][5]){int a_length=strlen(a)+1;//表达式的长度int p=0,num_p=0,op_p=0;int *num_s=(int *)malloc((a_length)*sizeof(int));// char *op_s=(char *)malloc((a_length)*sizeof(int));// op_s[op_p]='#';op_p++;//进字符栈int k=-1;//输出结果判断int ox,oy;while(1){char c=a[p];//将表达式中的字符一个一个赋值给cif(c>='0'&&c<='9')//判断是不是数字{num_s[num_p]=c-48;//将Ascll码转换成对应数字num_p++;//进数字栈p++;//代表表达式的位置开始为0指向第一位}else{int t=method[change(op_s[op_p-1])][change(c)];//将5种操作的一种传给tswitch(t){case 1:op_s[op_p]=c;op_p++;p++;break;case 2:k=0;break;case 3:op_p--;p++;break;case 4:ox=num_s[num_p-2];oy=num_s[num_p-1];num_p=num_p-2;num_s[num_p]=compu(ox,oy,op_s[op_p-1]);//将计算的值存入num_s[]num_p++;//入数字栈op_p--;break;case 5:k=1;break;}}if(k>=0)//跳出循环{break;}}switch(k)//0错误,1输出结果{case 0:printf("表达式错误!");break;case 1:printf("%s=%d\n",a,num_s[num_p-1]);break;}}int main(int argc,char *argv[]){ char a[20];puts("请输入个位数的表达式:");gets(a);int num_op=5;//表示操作的种数int method[5][5]={{1,3,2,1,1},{2,2,2,2,2},{1,2,5,1,1},{1,4,4,4,1},{1,4,4,4,4}};//1表示入栈,2表示错误,//3表示出栈,4表示出栈+计算,//5表示结束get(a,num_op,method);return 0;}图1.表达式求值运行结果。
数据结构实验报告 表达式求值
(一) 需求分析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. 表达式求值这个程序,主要利用栈和数组,把运算的先后步骤进行分析并实现简单的运算,以字符列的形式从终端输入语法的正确的、不含变量的整数表达式。
利用已知的算符优先关系,实现对算术四则运算的求值,在求值中运用栈、运算栈、输入字符和主要操作的变化过程。
该程序相当于一个简单的计算机计算程序,只进行简单的加减乘除和带括号的四则运算。
1、基本思想(中缀表达式求值)要把一个表达式翻译成正确求值的一个机器指令序列,或者直接对表达式求值,首先要能够正确解释表达式,要了解算术四则运算的规则即:(1)先乘除后加减;(2)从左到右计算;(3)先括号内,后括号外。
下表定义的运算符之间的关系:b + - * / () # a+ > > < < < > > _ > > < < < > > * > > > > < > > / > > > > < > > ( < < < < < = ) > > > > > > # < < < < < =为了实现运算符有限算法,在程序中使用了两个工作栈。
分别是:运算符栈OPTR,操作数栈OPND.基本思想:(1)首先置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素;(2)依次读入表达式中每个字符,若是操作数则进OPND栈,若是运算符则和OPTR栈得栈顶运算符比较优先级后作相应操作。
(完整版)数据结构与算法表达式求值报告
模块
• 各个模块的主要功能: *Push(SC *s,char c):把字符压栈 *Push(SF *s,float f):把数值压栈 *Pop(SC *s):把字符退栈 *Pop(SF *s):把数值退栈 Operate(a,theta,b):根据theta对a和b进行'+' 、'-' 、'*' 、'/' 、'^'操作 In(Test,*TestOp):若Test为运算符则返回true,否则返回false ReturnOpOrd(op,*TestOp):若Test为运算符,则返回此运算符在数组中的下标 precede(Aop,Bop):根据运算符优先级表返回Aop与Bop之间的优先级 EvaluateExpression(*MyExpression):用算符优先法对算术表达式求值
c++;
后ቤተ መጻሕፍቲ ባይዱ表达式的计算机求值
• 与前缀表达式类似,只是顺序是从左至右
• 从左至右扫描表达式, • 遇到数字,将数字压入栈; • 遇到运算符,弹出栈顶的两个数,用运算符对它们做相应的计算
(次顶元素 operate with 栈顶元素),并将结果入栈; • 重复上述过程直到表达式最右端,最后运算得出的值即为表达式
SC *Push(SC *s,char c)
//SC类型的指针Push,返回p {
SC *p=(SC*)malloc(sizeof(SC));
p->c=c; p->next=s;
return p;
}
SF *Push(SF *s,float f) //SF类型的指针Push,返回p { SF *p=(SF*)malloc(sizeof(SF)); p->f=f; p->next=s; return p; }
数据结构实验报告-算术表达式求值
- - 1.前言12.概要设计12.1 数据构造设计12.2 算法设计12.3 ADT描述22.4 功能模块分析23.详细设计33.1 数据存储构造设计33.2主要算法流程图〔或算法伪代码〕44.软件测试75.心得体会8参考文献8附录9- -优质-..1.前言在计算机中,算术表达式由常量、变量、运算符和括号组成。
由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进展。
因而在程序设计时,借助栈实现。
算法输入:一个算术表达式,由常量、变量、运算符和括号组成〔以字符串形式输入〕。
为简化,规定操作数只能为正整数,操作符为+、-*、/,用#表示完毕。
算法输出:表达式运算结果。
算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。
在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。
2.概要设计2.1 数据构造设计任何一个表达式都是由操作符,运算符和界限符组成的。
我们分别用顺序栈来存放表达式的操作数和运算符。
栈是限定于紧仅在表尾进展插入或删除操作的线性表。
顺序栈的存储构造是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,base为栈底指针,在顺序栈中,它始终指向栈底,即top=base可作为栈空的标记,每当插入新的栈顶元素时,指针top增1,删除栈顶元素时,指针top减1。
2.2 算法设计为了实现算符优先算法。
可以使用两个工作栈。
一个称为OPTR,用以存放运算符,另一个称做OPND,用以存放操作数或运算结果。
1.首先置操作数栈为空栈,表达式起始符〞#〞为运算符栈的栈底元素;2.依次读入表达式,假设是操作符即进OPND栈,假设是运算符那么和OPTR栈的栈顶运算符比拟优先权后作相应的操作,直至整个表达式求值完毕〔即OPTR栈的栈顶元素和当前读入的字符均为〞. .word.zl.数据构造课程设计第 2 页#〞〕。
数据结构表达式求值完整篇(含实验报告)
&s,SElemType_OPND&e); //出栈
/*
#i nclude "common .h"
#include "Sqstack.h"
#in clude "other.h"
//
void OPTR_I ni tStack(Sqstack_OPTR &s)
3前面的都听简单的,就是 小数编写这块想了很久,
定义了low做判定符号的标志。如果在运算符后输入负号则low=-1(将p入栈时入栈
的是p*low),继续输入ch
总结:
我觉得写的好的地方在于定义了flag,low分别作为小数入栈和负号与减号区别的条
件。第一次写这么长的代码,还有就是将输入的字符再转到小数这段代码可以留着很有 用。开始考虑的大整数想麻烦了,直接用double难度降低了很多
//取操作数的栈顶元素
voidOPTR_Push(Sqstack_OPTR
&s,SElemType_OPTR e);//入栈
voidOPND_Push(Sqstack_OPND
&s,SElemType_OPND e); //入栈
voidOPTR_Pop(Sqstack_OPTR
&s,SEIemType_OPTR&e); //出栈
//栈基本操作的函数声明
void OPTR_lnitStack(Sqstack_OPTR &s);
//运算符栈初始化
void OPBiblioteka D_InitStack(Sqstack_OPND &s);
//操作数栈初始化
数据结构表达式求值实验报告
数据结构表达式求值实验报告数据结构表达式求值实验报告⒈引言本实验旨在研究和实现数据结构中表达式求值的算法。
表达式求值是计算机科学中常见的问题,对于计算机程序的正确性和性能具有重要影响。
本报告将详细介绍实验设计、实验步骤、实验结果及分析,并对实验过程中遇到的问题进行讨论。
⒉实验设计⑴实验目的本实验的目的是实现一个可以对常见的算术表达式进行求值的算法,包括支持基本的加减乘除运算符和括号。
⑵实验环境●操作系统:Windows 10●开发语言:C++●开发工具:Visual Studio 2019⑶数据结构设计为了实现表达式求值的算法,我们需要设计适当的数据结构来存储和处理表达式。
本实验中,我们选择使用栈来实现表达式求值。
●表达式栈:用于存储操作数和运算符。
●运算符栈:用于存储运算符。
⑷算法设计表达式求值的算法可以分为以下几个步骤:●遍历表达式,逐个处理操作数和运算符:●如果是操作数,入表达式栈。
●如果是运算符,与运算符栈栈顶元素进行比较,根据优先级决定如何处理。
●当表达式遍历完成后,依次处理剩余的运算符。
●最终表达式栈中的元素即为求值结果。
⒊实验步骤⑴数据结构实现根据设计,我们首先实现表达式栈和运算符栈的数据结构,包括入栈、出栈等操作。
⑵表达式输入与预处理用户输入待求值的表达式,进行预处理,去除空格、验证表达式的合法性等。
⑶表达式求值算法实现根据前述的算法设计,实现表达式求值的算法,利用表达式栈和运算符栈来处理表达式。
⑷测试与结果分析对于不同的测试用例,进行表达式求值的测试,并分析结果的正确性和性能。
⒋实验结果与分析经过实验测试,我们得到了表达式求值的结果。
结果显示,我们的算法能够正确地求得表达式的值,而且性能良好。
⒌讨论与总结在实验过程中,我们遇到了一些问题,并进行了讨论和解决。
通过这个实验,我们更加深入地理解了表达式求值的算法,并对数据结构的应用有了更清晰的认识。
附件:无法律名词及注释:●无。
数据结构 四则运算表达式求值 实验四报告
为后缀表达式。
(3) 计算模块:计算后缀表达式的值。
(4) 输出模块:输出后缀表达式及其计算结果。
三、详细设计
物理数据类型
因为表达式由用户输入,存储操作符和操作数的栈长度不能确定,所以使用链式堆栈存
储这些变量。
堆栈基本操作如下:
bool push(const Elem& item) //压栈
{
top=new link<Elem>(item,top);
表达式。
运算时,运算符栈顶弹栈,然后获取操作数栈顶和次栈顶的值进行运算,把运算结果创
建一个叶子结点保存,把结点压回操作数栈中。如果操作数栈或运算符栈不为空时,继续进
行运算操作。最后操作数栈中的值,就是运算结果。
程序的流程
(1) 输入模块:输入把原始的中缀表达式的操作数和操作字符存储为一个字符串。 (2) 处理模块:把字符串逐个分解,调整各项字符的顺序,分解的中缀表达式转换
EvalExpr(ch[i],S); //弹栈,运算部分
i++;
}
}
if(S.length()==1)
S.pop(result);
}
(2)、 转换实数
int EvalValue(char* ch,Stack<double> &S)
{
int i=0;
double result=0;
char a;
a=ch[i];
}
bool topValue(Elem& it) const //获取栈顶的值
{
if(size==0) return false;
it=top->elem;
return true;
数据结构实验二——算术表达式求值实验报告
数据结构实验二——算术表达式求值实验报告算术表达式求值实验报告一、引言算术表达式求值是计算机科学中一个重要的基础问题,它涉及到了数据结构和算法的应用。
本实验旨在通过实现一个算术表达式求值的程序,加深对数据结构中栈的理解和应用,并掌握算术表达式的求值过程。
二、实验目的1. 理解算术表达式的基本概念和求值过程;2. 掌握栈的基本操作和应用;3. 实现一个能够正确求解算术表达式的程序;4. 进一步熟悉编程语言的使用。
三、实验内容1. 设计并实现一个栈的数据结构;2. 实现算术表达式求值的算法;3. 编写测试用例,验证程序的正确性;4. 进行性能测试,分析算法的时间复杂度。
四、实验方法与步骤1. 设计栈的数据结构在本实验中,我们选择使用数组来实现栈的数据结构。
栈的基本操作包括入栈(push)、出栈(pop)、判断栈空(isEmpty)和获取栈顶元素(top)等。
2. 算术表达式求值算法算术表达式求值的一种常用算法是通过后缀表达式进行求值。
具体步骤如下: - 将中缀表达式转换为后缀表达式;- 通过栈来求解后缀表达式;- 返回最终的计算结果。
3. 编写测试用例编写一系列测试用例,包括不同类型的算术表达式,以验证程序的正确性。
例如:- 简单的四则运算表达式:2 + 3 * 4 - 5;- 包含括号的表达式:(2 + 3) * (4 - 5);- 包含多位数的表达式:12 + 34 * 56;- 包含浮点数的表达式:3.14 + 2.71828。
4. 性能测试和时间复杂度分析针对不同规模的输入数据,进行性能测试,记录程序的运行时间。
同时,分析算法的时间复杂度,验证算法的效率。
五、实验结果与分析我们设计并实现了一个栈的数据结构,并成功地完成了算术表达式求值的程序。
通过对一系列测试用例的验证,我们发现程序能够正确地求解各种类型的算术表达式,并返回正确的计算结果。
在性能测试中,我们对不同规模的输入数据进行了测试,并记录了程序的运行时间。
算术表达式求值实验报告
算术表达式求值实验报告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.表达式是由操作数,运算符和界限符组成。
2.实现算符优先算法,实用两个工作栈。
一个叫OPTR,用以寄存运算符;一个叫OPND,用以寄存操作数或运算结果。
3.算法的基本思路:
(1)首先置操作数栈为空栈,表达式起始符#作为运算符栈的栈底元素;
(2) 依次读入表达式中的每个字符,通过运算符判断函数In()使操作数进OPND 栈;
(3)通过函数Precede()将运算符与OPTR栈的栈底运算符比较出优先权,若栈顶元素优先权低则输入下个操作数到OPND,若两优先权相等,脱号并接受下一个字符,若栈顶元素优先高,退栈并将运算结果(通过函数Operate()运算)入栈。
循环上述操作直到表达式求值结束。
(4)返回运算结果。
4.所用的函数及作用:
InitStack():构造一个空栈
Push():插入元素进栈
GetTop():返回栈顶元素
Precede():运算符优先权进行判断
Pop():元素出栈
Operate():运算操作数
5. 测试结果与分析
上述程序在Visual C++ 6.0环境下加以实现。
经过多次测试,程序运行正确。
运行结果。
如图所示:
6. 收获与体会
通过这次课程设计:
1.我又进一步巩固了C语言的基础,尤其是栈。
2.算法中需要建很多的函数,队提高了自己的编程能力有帮助,
3.程序不够简洁,还有待改进,功能还有待更完善。
数据结构实验报告-3-求解算术表达式
实验3 利用栈实现算术表达式求值一、实验目的1、帮助读者复习C语言程序设计中的知识。
2、熟悉栈的逻辑结构。
3、了解算术表达式计算的逻辑过程。
4、熟悉算术表达式计算过程中优先级的运算方法。
5、了解中缀表达式和后缀表达式的区别。
二、实验内容[问题描述]1.实验目标:利用栈的特性,实现算术表达式的运算,了解算术运算的逻辑,掌握栈的特性。
2.中缀表达式与后缀表达式的含义中缀表达式就是通常所说的算术表达式,比如(1+2)*3-4。
后缀表达式是指通过解析后,运算符在运算数之后的表达式,比如上式解析成后缀表达式就是12+3*4-。
这种表达式可以直接利用栈来求解。
[基本要求](1)利用栈实现后缀表达式的计算;(2)利用栈实现中缀表达式到后缀表达式的转换。
(可选)基于程序易于设计的考虑,我们仅需要实现一位数值(0-9)的+,-,*,/,()等运算。
三、设计思路四、源代码#include<stdio.h>#include<string.h>#include<stdlib.h>#define max 100typedef struct{float data[max];int top;}seqstack;void InitStack(seqstack *s);int StackEmpty(seqstack *s);int StackFull(seqstack *s);void Push(seqstack *s,char x);int Pop(seqstack *s);float ComputeExpress(char a[]);void main(){char a[max],b[max];float f;printf("请输入一个后缀表达式:\n");gets(a);printf("后缀表达式为:%s\n",a);f=ComputeExpress(b);printf("计算结果为:%f\n",f);}void InitStack(seqstack *s){s->top=-1;}int StackEmpty(seqstack *s){return s->top==-1;}int StackFull(seqstack *s){return s->top==max-1;}void Push(seqstack *s,char x){if(StackFull(s))printf("overflow");s->data[++s->top]=x;}int Pop(seqstack *s){if(StackEmpty(s))printf("underflow");return s->data[s->top--];}float ComputeExpress(char a[]){seqstack s;int i=0;float x1,x2,value;float result;s.top=-1;while(a[i]!='\0'){if(a[i]!=' '&&a[i]>='0'&&a[i]<='9'){value=0;while(a[i]!=' '){value=10*value+a[i]-'0';i++;}s.top++;s.data[s.top]=value;}else{switch(a[i]){case'+':x1=s.data[s.top];s.top--;x2=s.data[s.top];s.top--;result=x1+x2;s.top++;s.data[s.top]=result;break;case'-':x1=s.data[s.top];s.top--;x2=s.data[s.top];s.top--;result=x2-x1;s.top++;s.data[s.top]=result;break;case'*':x1=s.data[s.top];s.top--;x2=s.data[s.top];s.top--;result=x1*x2;s.top++;s.data[s.top]=result;break;case'/':x1=s.data[s.top];s.top--;x2=s.data[s.top];s.top--;result=x2/x1;s.top++;s.data[s.top]=result;break;}i++;}}if(s.top!=-1)result=s.data[s.top];s.top--;if(s.top==-1)return result;else{printf("表达式错误");exit(-1);}}五、测试结果六、心得体会这次实验我只做了利用栈实现后缀表达式的计算熟悉栈的逻辑结构,同时了解算术表达式计算的逻辑过程。
算术表达式求值数据结构实验报告
算法的正确性和效率分析
正确性
所有实现的数据结构都正确地实现了算术表达式求值的功能,没有出现计算错 误的情况。
效率
在处理大量数据时,使用堆栈(Stack)和队列(Queue)的数据结构表现最 佳。堆栈在处理后缀表达式时效率最高,而队列在处理中缀表达式时效率最高 。
数据结构优化的效果评估
使用哈希表(Hash Table)
展望未来,希望能够进一步研究算术 表达式求值算法的优化和改进,提高 计算效率和精度。
THANKS
感谢观看
05
列表(List)
数组(Array) 元组(Tuple) 集合(Set)
字典( Dictiona…
由于列表在Python中是动 态数组,其性能在处理大 量数据时相对较差。在算 术表达式求值中,列表的 平均执行时间最长。
使用NumPy库的数组结构 ,其性能在处理大量数据 时优于列表。但在算术表 达式求值中,其性能仍然 不如其他数据结构。
03
了解如何使用栈数据结构实现括号匹配和回退机制 。
掌握数据结构在算术表达式求值中的应用
01 熟悉使用数组、链表等基本数据结构存储和操作 算术表达式。
02 掌握如何使用树形数据结构表示算术表达式,如 二叉树或表达式树。
03 了解动态规划在优化算术表达式求值中的运用。
提高编程能力和解决问题的能力
01
在处理重复元素时,使用哈希表可以显著提高数据结构的效率。在算术表达式求值中,哈希表的使用可以减少重 复计算和查找的时间。
预处理输入数据
对输入的算术表达式进行预处理,如括号消除、指数化等,也可以提高数据结构的效率。预处理可以减少运算的 复杂度和时间。
05
实验总结
本次实验的收获和体会
数据结构表达式求值实验报告
数据结构表达式求值实验报告一、实验目的本次实验的主要目的是通过实现表达式求值的程序,深入理解数据结构和算法在解决实际问题中的应用。
具体包括掌握栈这种数据结构的操作和使用,熟悉表达式的转换和计算过程,提高编程能力和问题解决能力。
二、实验环境本次实验使用的编程语言为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”等,程序能够正确地将其转换为后缀表达式,并计算出结果。
数据结构表达式求值完整篇(含实验报告)
2.操作数和运算符分别入不同的栈
char->int 进操作数栈
先考虑了小于10的整数直接进栈,重点是运算符的优先级这块函数的编写
3前面的都听简单的,就是小数编写这块想了很久,
将单个字符转为整数后还要定一个double p;使依次输入的数成一个小数->p.
}
//操作数栈初始化
void OPND_InitStack(Sqstack_OPND &s)
{
s.base=new SElemType_OPND[MAXSIZE];
if(!s.base)
printf("\n操作数栈存储分配失败!\n");
s.top=s.base;
s.stacksize=MAXSIZE;
if(ch != '.' )
{
if ( dimo != '.' )
{
p = p*10 ;
p += (ch-'0');
scanf("%c",&ch);
}
else if ( dimo == '.')
{
p = p+(ch-'0')*q;
q=q*q;;
scanf("%c",&ch#39;.' )
}
//操作数入栈
void OPND_Push(Sqstack_OPND &s,SElemType_OPND e)
{
if(s.top-s.base == s.stacksize)
printf("\n满栈!\n");
数据结构表达式求值实验报告
竭诚为您提供优质文档/双击可除数据结构表达式求值实验报告篇一:数据结构实验二——算术表达式求值实验报告《数据结构与数据库》实验报告实验题目算术表达式求值学院:化学与材料科学学院专业班级: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!二、概要设计拟采用两种类型的展分别对操作数和操作符进行操作。
《数据结构 课程设计》表达式求值 实验报告
实验课程名称专业班级学生姓名学号指导教师20 至 20 学年第学期第至周算术表达式求值演示一、概述数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。
同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
在这次的课程设计中我选择的题目是算术表达式求值演示。
表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。
设计一个程序,演示用算符优先法对算术表达式求值的过程。
深入了解栈和队列的特性,以便在解决实际问题中灵活运用它们,同时加深对这种结构的理解和认识。
二、系统分析1.以字符列的形式从终端输入语法正确的、不含变量的整数表达式。
利用已知的算符优先关系,实现对算术四则混合运算表达式的求值,并仿照教科书的例子在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。
2.一般来说,计算机解决一个具体问题时,需要经过几个步骤:首先要从具体问题抽象出一个适当的数学模型,然后设计一个解决此数学模型的算法,最后编出程序,进行测试,调试直至得到想要的答案。
对于算术表达式这个程序,主要利用栈,把运算的先后步骤进行分析并实现简单的运算!为实现算符优先算法,可以使用两个栈,一个用以寄存运算符,另一个用以寄存操作数和运算结果。
3.演示程序是以用户于计算机的对话方式执行,这需要一个模块来完成使用者与计算机语言的转化。
4.程序执行时的命令:本程序为了使用具体,采用菜单式的方式来完成程序的演示,几乎不用输入什么特殊的命令,只需按提示输入表达式即可。
(要注意输入时格式,否者可能会引起一些错误)5. 测试数据。
三、概要设计一个算术表达式中除了括号、界限符外,还包括运算数据和运算符。
由于运算符有优先级别之差,所以一个表达式的运算不可能总是从左至右的循序执行。
每次操作的数据或运算符都是最近输入的,这与栈的特性相吻合,故本课程设计借助栈来实现按运算符的优先级完成表达式的求值计算。
数据结构表达式求值实验报告
数据结构表达式求值实验报告关键信息项:1、实验目的:____________________________2、实验环境:____________________________3、实验原理:____________________________4、实验步骤:____________________________5、测试用例及结果:____________________________6、实验总结:____________________________11 实验目的本实验的主要目的是通过使用数据结构和算法来实现表达式求值的功能,加深对栈、队列等数据结构的理解和运用,提高编程能力和解决实际问题的能力。
111 具体目标包括掌握中缀表达式转换为后缀表达式的方法。
利用栈结构实现后缀表达式的求值运算。
能够处理表达式中的运算符优先级和括号。
12 实验环境本次实验使用的编程环境为具体编程语言和版本,在操作系统名称操作系统上进行。
121 所需软件和工具编程软件名称:用于编写和调试代码。
测试工具名称:用于对程序进行测试和验证。
13 实验原理表达式求值是程序设计中的一个常见问题。
中缀表达式符合人们的日常书写习惯,但直接求值较为复杂。
将中缀表达式转换为后缀表达式后,求值过程会变得更加简单和直观。
131 中缀转后缀表达式的原理遇到操作数,直接输出。
遇到运算符,将其与栈顶运算符进行优先级比较。
若优先级高于栈顶运算符,则入栈;否则,弹出栈顶运算符并输出,直到当前运算符优先级高于栈顶运算符或栈为空,然后将当前运算符入栈。
遇到左括号,直接入栈。
遇到右括号,弹出栈顶运算符并输出,直到遇到左括号,左括号出栈但不输出。
132 后缀表达式求值的原理从左到右扫描后缀表达式。
遇到操作数,压入栈中。
遇到运算符,从栈中弹出两个操作数,进行相应运算,将结果压入栈中。
扫描结束后,栈顶元素即为表达式的结果。
14 实验步骤141 数据结构设计定义一个栈来存储运算符。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
软件技术基础实验报告实验名称:表达式计算器系别:通信工程年级:班级:学生学号:学生姓名:《数据结构》课程设计报告题目简易计算表达式的演示【题目要求】要求:实现基本表达式计算的功能输入:数学表达式,表达式由整数和“+”、“-”、“×”、“/”、“(”、“)”组成输出:表达式的值基本操作:键入表达式,开始计算,计算过程和结果记录在文档中难点:括号的处理、乘除的优先级高于加减1.前言在计算机中,算术表达式由常量、变量、运算符和括号组成。
由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。
因而在程序设计时,借助栈实现。
算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。
为简化,规定操作数只能为正整数,操作符为+、-*、/、=,用#表示结束。
算法输出:表达式运算结果。
算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。
在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。
2.概要设计2.1 数据结构设计任何一个表达式都是由操作符,运算符和界限符组成的。
我们分别用顺序栈来寄存表达式的操作数和运算符。
栈是限定于紧仅在表尾进行插入或删除操作的线性表。
顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top 指示栈顶元素在顺序栈中的位置,base 为栈底指针,在顺序栈中,它始终指向栈底,即top=base 可作为栈空的标记,每当插入新的栈顶元素时,指针top 增1,删除栈顶元素时,指针top 减1。
2.2 算法设计为了实现算符优先算法。
可以使用两个工作栈。
一个称为OPTR ,用以寄存运算符,另一个称做OPND ,用以寄存操作数或运算结果。
1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素;2.依次读入表达式,若是操作符即进OPND 栈,若是运算符则和OPTR 栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR 栈的栈顶元素和当前读入的字符均为”#”)。
2.3 ADT 描述 ADT Stack{ 数据对象:D={ia |i a∈ElemSet,i=1,2,…,n, n ≧0}数据对象:R1={<1,-i i a a >|1-i a ,D a i ∈,i=2,…,n}约定n a端为栈顶,i a端为栈底。
基本操作:InitStack(&S)操作结果:构造一个空栈S。
GetTop(S)初始条件:栈S已存在。
操作结果:用P返回S的栈顶元素。
Push(&S,ch)初始条件:栈S已存在。
操作结果:插入元素ch为新的栈顶元素。
Pop(&S)初始条件:栈S已存在。
操作结果:删除S的栈顶元素。
In(ch)操作结果:判断字符是否是运算符,运算符即返回1。
Precede(c1, c2)初始条件:c1,c2为运算符。
操作结果:判断运算符优先权,返回优先权高的。
Operate(a,op,b)初始条件:a,b为整数,op为运算符。
操作结果:a与b进行运算,op为运算符,返回其值。
num(n)操作结果:返回操作数的长度。
EvalExpr()初始条件:输入表达式合法。
操作结果:返回表达式的最终结果。
}ADT Stack2.4 功能模块分析1.栈的基本功能。
InitStack(Stack *s) 和InitStack2(Stack2 *s)分别构造运算符栈与构造操作数栈,Push(Stack *s,char ch) 运算符栈插入ch为新的栈顶元素,Push2(Stack2 *s,int ch) 操作数栈插入ch为新的栈顶元素,Pop(Stack *s) 删除运算符栈s的栈顶元素,用p返回其值,Pop2(Stack2 *s)删除操作数栈s的栈顶元素,用p返回其值,GetTop(Stack s)用p返回运算符栈s的栈顶元素,GetTop2(Stack2 s) 用p返回操作数栈s的栈顶元素。
2.其它功能分析。
(1)In(char ch) 判断字符是否是运算符功能,运算符即返回1,该功能只需简单的一条语句即可实现,return(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#')。
(2) Precede(char c1,char c2) 判断运算符优先权功能,该函数判断运算符c1,c2的优先权,具体优先关系参照表1。
(3) Operate(int a,char op,int b)操作数用对应的运算符进行运算功能。
运算结果直接返回。
(4) num(int n) 求操作数的长度功能,需要用itoa函数把int型转换成字符串型,strlen函数可求字符长度。
(5) EvalExpr()主要操作函数运算功能。
分析详细见“3.详细设计…3.2”。
3.详细设计3.1 数据存储结构设计因为表达式是由操作符,运算符和界限符组成的。
如果只用一个char类型栈,不能满足2位以上的整数,所以还需要定义一个int类型的栈用来寄存操作数。
/* 定义字符类型栈*/struct stacklifei1 //数字栈的定义{double *base;double *top;}s1;/struct stacklifei2 //运算符栈的定义{char *base;char *top;}s2;3.2 计算功能的实现void jisuan() // 该函数对数字栈的前两个栈顶//元素与符号栈的栈顶元素完成一次运算操作{double a,b;b=*(s1.top-1);s1.top--;if(s1.top==s1.base){error=1;return ;}a=*(s1.top-1);switch(*(s2.top-1)){case '+':a=a+b;break;case '-':a=a-b;break;case '*':a=a*b;break;case '/':if(b==0){error=2;s2.top=s2.base;return ;}//除数不为0else a=a/b;break;default :error=1;}fprintf(file,"%lf %c %lf= %lf\n",*(s1.top-1),*(s2.top-1),b,a);*(s1.top-1)=a; //将运算结果入栈s2.top--;return ;}3.3函数表达式求值功能的实现void qiuzhi(char *cr)该函数完成对表达式的处理{int i=0,k,h,flag,fuhao=0;double sum,j;s1.base=s1.top=shuzhi;s2.base=s2.top=fuha;*(s2.top)='#';s2.top++;while(s2.top!=s2.base){sum=0;flag=0;k=10;j=1;h=1;while(cr[i]>='0'&&cr[i]<='9'||cr[i]=='.')//若当前的字符是数字,就将char型的数据转换为double型{if(cr[i]=='.'){if(cr[i-1]<'0'||cr[i-1]>'9'||i==0||cr[i+1]<'0'||cr[i+1]>'9'){error=1;break;}else{k=1;h=10;}}else{flag=1;j=j*h;sum=sum*k+(cr[i]-48)/j;}i++;}3.4对函数表达式每个字符的操作switch(cr[i]){case '-':if(cr[i-1]=='('||i==0){fuhao=1;i++;break;}//判断是不是负号,若不是则进行与加号相同的操作//当'-'出现在表达式第一位或是'('后第一位,则应将其判为负号case '+'://加、减号的优先级只比'('和'='高,若栈顶元素为这两者之一//就将其入栈,否则执行运算操作if(*(s2.top-1)=='('||*(s2.top-1)=='#'){*(s2.top)=cr[i];s2.top++;i++;}else jisuan();break;case '*':case '/'://乘、除号的优先级只比'*'、'/'和'^'低,若栈顶元素为这三者之一//就执行运算操作,否则将其入栈if(*(s2.top-1)=='*'||*(s2.top-1)=='/')jisuan();else{*(s2.top)=cr[i];s2.top++;i++;}break;case '(': *(s2.top)=cr[i]; s2.top++;i++;break;//未入栈时'('的优先级最高,所以它一定要入栈//但一入栈其优先级就应降为最低case ')'://注意:由于'()'运算优先级最高故我直接进行运算,//直到栈顶元素为'('后将'('出栈,故符号栈中一定没有')',//这也是我进行以上优先级判断的前提if(*(s2.top-1)=='('){s2.top--;i++;}else jisuan();break;case '='://表达式结束,若符号栈栈顶元素不为'#',进行运算//否则退栈,结束if(*(s2.top-1)=='#'){s2.top--;}else jisuan();break;default :i++; //清除空格及未定义符号}3.5主菜单页面的实现void main(){char cr[60];char c='a';file=fopen(outfile,"w+");//使用提示printf("****************************************************************** *************\n");printf("*********************************李斐计算器************************************\n");printf("四则简易计算器\n\n");printf("输入表达式例如2+4= \n\n");printf("最后按# 键则会退出保存\n\n");printf("谢谢使用\n\n");printf("------------------------------------------------------------------------------\n");printf("****************************************************************** ************\n");//循环输入表达式,按'#'键退出while(c!='#'){error=0;printf("输入表达式:\n");gets(cr);fprintf(file,"表达式:%s\n",cr);qiuzhi(cr);printf("任意键继续,按# 键退出:\n");c=getch();}fclose(file);}【附加一】算符间的优先关系如下:4.软件测试1.运行成功后界面。