中缀表达式求值实验报告

合集下载

数据结构实验报告--表达式求值

数据结构实验报告--表达式求值

void Initstack1(stack1 *s>
{
(*s>->base = (int *>malloc(SIZE * (sizeof(int>>>

(*s>->top = (*s>->base

(*s>->stacksize = INCREMENT 。
}
int Ifempty2(stack2 *s>
<6)中缀转后缀并计算模块:
( 三 > 详细设计
1.元素类型 , 结点类型和指针类型:
typedef struct{
int stacksize 。 int *base 。
int *top 。
}Sqstack1,*stack1 。
typedef struct{
int stacksize 。
char *base 。
{
if(((a=='*'>||(a=='/'>>&&((b=='+'>||(b=='-'>||(b=='#'>>>
5PCzVD7HxA
return '>'

else
return '<'

}
<4)运算符操作模块;
int Operate(int a,char b,int c>
{
int t 。
if(b == '+'> t = a + c
{

【7A版】四则运算表达式求值实验报告

【7A版】四则运算表达式求值实验报告

HUNANUNIVERSITY课程实习报告题目:四则运算表达式求值学生姓名:学生学号:专业班级:指导老师:完成日期:一、需求分析四则运算表达式求值,将四则运算表达式用中缀表达式表示,然后转换为后缀表达式,并计算结果。

本程序要求利用二叉树后序遍历来实现表达式的转换,同时可以使用实验2的结果来求解后缀表达式的值。

在字符界面上输入一个中缀表达式,回车表示结束。

如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。

测试数据输入:21+23G(12-6)输出:2123126-G+二、详细设计输入和输出的格式输入本程序可以将输入的四则运算表达式(中缀表达式)转换为后缀表达式输出后缀表达式为://输出结果的位置表达式的值为://输出结果的位置三、调试分析本次实验的难点主要是在建立二叉树的问题上。

关于如何把中缀表达式存入二叉树中,我参考了网上的一些方法,成功实现了目标,但是却遇到了一个问题,那就是不能处理小数,甚至两位或两位以上的整数。

因为如果采用字符数组来存储操作数,运算符合一位整数还可以处理,但对于两位数就就会出问题,最后我改进采用字符串数组来存储操作数,成功解决了问题。

另外在处理输入的非法表达式问题中,我也费了很大功夫,但总体问题不大。

四、测试结果五、用户使用说明(可选)1、运行程序时提示输入四则运算表达式本程序可以将中缀表达式转化为后缀表达式,并计算结果请输入四则运算表达式:输出后缀表达式为:表达式的值为:程序源代码(c++)#include<iostream>#include<string>#include<stack>#include<iomanip>constintMaG=100;usingnamespacestd;classNode{public:charch[MaG];//考虑到数值有时会是两位数,所以使用字符串数组NodeGlChild;NodeGrChild;Node(){strcpy(ch,"");lChild=rChild=NULL;}~Node(){if(lChild!=NULL)deletelChild;if(rChild!=NULL)deleterChild;}};staticintcount=0;staticchararray[MaG];//保存原始的中缀表达式staticcharstr[2GMaG];//保存后序遍历出来的字符串,为表达式求值提供方便staticintk=0;chargetOp(NodeGtemp);//temp指针保存每个结点,返回的是运算符NodeGcrtTree(NodeGroot);//传入根结点指针,返回根结点指针voidoutput(NodeGroot);//获得处理后的字符串boolisError(char);//判断字符是否有问题voiddeal();//对字符数组进行处理doublevalue(string);//计算后缀表达式,得到其结果。

算术表达式求值实验报告

算术表达式求值实验报告

算术表达式求值实验报告前言算术表达式求值是计算机科学中比较基础的内容,同时也是很实用的技能,因为有时候我们需要用程序来计算一些复杂的数学运算。

在本次实验中,我们将对算术表达式的求值进行深入研究,并实际编写程序来实现这一功能。

实验原理算术表达式通常由数字、运算符和括号组成,我们需要将其转换为计算机能够直接执行的形式。

常见的算术表达式求值方法有两种:1.中缀表达式求值中缀表达式就是我们平时所熟悉的数学表达式,如2+3*4-5/2。

中缀表达式求值需要遵循一定的运算符优先级和括号的影响,可以通过栈来实现。

首先,我们需要将中缀表达式转换为后缀表达式,即将运算符放在数字后面。

具体的转换方法可以使用栈来实现。

遍历中缀表达式,遇到数字就直接输出,遇到运算符就将其与栈顶运算符进行比较,如果优先级高于栈顶运算符,则将其入栈,否则将栈顶运算符弹出并输出,直到遇到优先级小于等于栈顶运算符或者栈顶为空时,将运算符入栈。

最后将栈中的运算符依次弹出并输出即可。

转换为后缀表达式之后,我们可以通过再次遍历后缀表达式来求值。

遇到数字将其入栈,遇到运算符则弹出栈顶两个数字进行运算,并将结果入栈。

遍历完毕后,栈中剩下的数字就是最终结果。

2.前缀表达式求值前缀表达式就是将运算符放在数字前面的表达式,如:- + * 3 4 5 6。

前缀表达式求值与后缀表达式求值类似,不同之处在于需要从右至左遍历表达式,并将运算符与栈顶数字进行操作。

实验步骤在本次实验中,我们将通过 Python 语言来实现算术表达式求值功能。

具体步骤如下:1. 输入待求值的算术表达式。

2. 对算术表达式进行转换,得到后缀表达式或前缀表达式。

3. 遍历后缀表达式或前缀表达式,求出最终结果。

4. 输出结果。

实验结果我们在 Python 中编写了求解算术表达式的程序,以下是一些样例输入和输出:1. 输入:2+3*4 输出:142. 输入:(2+3)*4 输出:203. 输入:-+*3456 输出:-9通过多组测试,我们可以发现程序能够正确地求解各种算术表达式,包括包含括号和负数的表达式。

数据结构实验报告 表达式求值

数据结构实验报告 表达式求值

(一) 需求分析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栈得栈顶运算符比较优先级后作相应操作。

基于栈结构的中缀表达式求值

基于栈结构的中缀表达式求值

实验三基于栈结构的中缀表达式求值班级:计科131、问题描述从键盘输入一中缀表达式字符串,读字符串,利用栈结构实现表达式求值。

2、输入与输出输入:从键盘中缀表达式如: 32+5×(6-4)输出:计算结果423、需求分析1.定义两个栈结构,数栈用于存放表达式中的数,符号栈用于存放表达式中的符号,实现栈的运算2.在读数的时候考虑多位运算3.实现表达式求值4、开发工具与环境硬件设备:微型计算机系统软件环境:操作系统Windows,开发工具等等5、概要设计1.结构定义typedef struct /* 运算符栈 */{ char *base,*top;int stacksize;}SqStack;typedef struct /* 运算数栈 */{ int *base,*top;int stacksize;}SqStack1;int priority[7][7]={{'>', '>', '<', '<', '<', '>', '>'}, // +{'>', '>', '<', '<', '<', '>', '>'}, // -{'>', '>', '>', '>', '<', '>', '>'}, // *{'>', '>', '>', '>', '<', '>', '>'}, // /{'<', '<', '<', '<', '<', '=', }, // ({'>', '>', '>', '>', ' ', '>', '>'}, // ){'<', '<', '<', '<', '<', ' ', '='} // #};/*用于比较符号优先级的全局二维数组*/2.各函数模块void InitStack(SqStack *s);操作结果:初始化运算符栈。

数据结构表达式求值实验报告-无删减范文

数据结构表达式求值实验报告-无删减范文

数据结构表达式求值实验报告数据结构表达式求值实验报告1. 引言表达式求值是计算机科学中的一个重要问题,也是数据结构的一个经典应用。

通过将中缀表达式转换为后缀表达式,并利用栈这一数据结构,可以实现对表达式的有效求值。

本实验旨在探究数据结构在表达式求值中的应用。

2. 实验内容本实验中,我们将实现一个表达式求值的程序。

具体步骤如下:1. 将中缀表达式转换为后缀表达式。

2. 使用栈来求解后缀表达式。

3. 算法原理3.1 中缀表达式转后缀表达式中缀表达式是我们常见的数学表达式,如 2 + 3 4。

而后缀表达式是将操作符放在操作数后面的表达式,上述中缀表达式的后缀表达式为 2 3 4 +。

中缀表达式到后缀表达式的转换可以通过以下步骤完成:1. 初始化一个栈和一个输出队列。

2. 从左到右遍历中缀表达式的每个字符。

3. 如果当前字符是数字,将其加入输出队列。

4. 如果当前字符是左括号,将其压入栈。

5. 如果当前字符是右括号,将栈中的操作符依次弹出并加入输出队列,直到遇到左括号为止。

6. 如果当前字符是操作符,将其与栈顶操作符进行比较:1. 如果栈为空,或者栈顶操作符为左括号,直接将当前操作符压入栈。

2. 否则,比较当前操作符与栈顶操作符的优先级,如果当前操作符的优先级较低,将栈顶操作符弹出并加入输出队列,然后将当前操作符压入栈。

3. 如果当前操作符的优先级大于等于栈顶操作符的优先级,则直接将当前操作符压入栈。

7. 遍历完中缀表达式后,将栈中的操作符依次弹出并加入输出队列。

3.2 后缀表达式求值通过将中缀表达式转换为后缀表达式,我们可以利用栈来对后缀表达式进行求值。

具体求值操作如下:1. 初始化一个栈。

2. 从左到右遍历后缀表达式的每个字符。

3. 如果当前字符是数字,将其加入栈。

4. 如果当前字符是操作符,从栈中弹出两个数字,进行相应的运算,然后将结果加入栈。

5. 遍历完后缀表达式后,栈中的元素即为最终的结果。

4. 实验结果我们用中缀表达式\。

程序设计实训报告—表达式求值问题

程序设计实训报告—表达式求值问题

程序设计实训报告—表达式求值问题完成者:何炜班级:计科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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法运行:将输入的中缀表达式改为后缀表达式,并进行运算。
算法输出:输出后缀表达式和表达式运算结果。
3.测试数据:
(1)、1+3*4-(5/5);一位数运算
(2)、45-5*(1+2)/5;多位数运算
二、概要设计
整个程序包含功能模块及模块间的调用关系
(1)、struct node创建结构体,被主函数调用
{
p=(struct node *)malloc(sizeof(struct node)); p->data=a;
p->next=top;
top=p;
br;:
case'/':
s2[j]='';
j++;
if((top->data=='*')||(top->data=='/'))
{
中缀表达式求值实验报告
一、需求分析(要实现的功能描述)
1.问题描述:
在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的 运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严 格地从左到右进行。因而在程序设计时,借助栈实现。
2.实现功能:
算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符 串形式输入)。为简化,规定操作数只能为正整数,操作符为“、+-、 * 、 / ”。
用以区分前后两个数字,如 12+45*,如果直接存入字符串中会是s2:1245*+; 但加空格后为s2:12 (空格)45*+;这样后面运算时就好区分两多位数字。
2.心得体会
在写程序之前要选择适合自己的算法即自己熟悉的能编出的算法,这样后 续的编程会简便多了。
对于一个要实现的功能,会有很多不同的算法,当你一个算法用不了时, 可以换一个算法编程,目的是死的,人是活的,算法是活的,程序也是活的!
struct node *top;
top=(struct node *)malloc(sizeof(struct node)); top->data=';';
top->num=0; top->next=NULL;
return top;
}
struct node *assort(struct node *s)//输入字符串
(2)、45-5*(1+2) /5;
七、程序清单
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#define MAX60
#define RIGHT1
#define WRONG0
#define DEMAX15
在写将多位数(比如 123*12)存放字符串中时,一开始我想着直接转换成 数字存入数组中,但一直不成功,只能将第一个多过程中,我 发现几个数字之间可能没法区分是前一个数字的还是后一个数字的,于是我在
扫描字符串过程中在扫描到操作字符时将存入数字的那个字符串s2空出一位,
{
struct node *p,*top;
int i;
top=s;
int m;
char a; m=strlen(s1);
for(i=0; i<=m; i++)
{
a=s1[i];
if('0'<=s1[i]&&s1[i]<='9')
{
s2[j]=s1[i];
j++;
}
else
{
switch(a)
case'(':
s2[j]=top->data;
j++;// 比其高,现将栈顶运算符出栈,再进栈top->data=a;
break;
}
else
{
p=(struct node *)malloc(sizeof(struct node));//否,直接进栈p->data=a;
p->next=top;
top=p;
break;
#define NULL0
char s1[MAX];
char s2[MAX];
int j=0;
struct node// 定义结构体。
{
char data;
int num;
struct node *next;
};
struct node *Initialization()//初始化栈链 ,链栈不带头结点{
五、用户手册
该软件的操作方法简介
输入一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式 输入)。为简化,规定操作数只能为正整数,操作符为“、+-、*、/ ”,按回车结
束输入。程序运行输出输出后缀表达式和表达式运算结果。
六、测试结果
根据已提供的测试数据得到什么样的结果(可以截屏)
(1)、1+3*4-(5/5);
p=top; top=top->next; free(p);
}
case'+':
case'-':
{
s2[j]='';
j++;
if(top->data=='+'||top->data=='-'||top->data=='*'||top->data=='/'){ s2[j]=top->data;
j++;
top->data=a;
break;
}
else
{
p=(struct node *)malloc(sizeof(struct node));
p->data=a;
p->next=top;
top=p;
break;
}
}
case')':
{
s2[j]='';
j++;
if(top->data==';')
{
printf("input error"); break;
}while(top->data!='(')
{s2[j]=top->data; j++;
(5)、void main()主函数,调用所有函数
三、详细设计
抽象数据类型中定义的各种操作算法实现(用N-S图描述)
开始
输入中缀
表达式
将中缀表达式转换成
后缀表达式并存入s2

输出后缀
表达式
计算结果
输出结

结束
四、调试分析
1.程序在调式过程中出现的问题及解决方法
一开始选用直接运算方式运用两个栈来存放数字和操作符,后来写着确实 不行然后直接转用转为后缀表达式再进行计算。
(2)、struct node *Initialization()创建栈链,被主函数调用
(3)、struct node *assort(struct node *s)将中缀表达式转换为后缀表达式并存在s2中被主函数调用
(4)、struct node *calcolate(struct node *s)求出表达式的值,被主函数调用
相关文档
最新文档