【数据结构与数据库-实验报告】表达式求值(栈)

合集下载

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

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

竭诚为您提供优质文档/双击可除数据结构表达式求值实验报告篇一:数据结构实验二——算术表达式求值实验报告《数据结构与数据库》实验报告实验题目算术表达式求值学院:化学与材料科学学院专业班级: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!二、概要设计拟采用两种类型的展分别对操作数和操作符进行操作。

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

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

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
{

表达式求值(数据结构-栈的应用)

表达式求值(数据结构-栈的应用)

表达式求值(数据结构-栈的应⽤)⼀.问题描述:限制:只含有‘+’,‘-’,‘*’,‘/ ’和圆括号,正整数。

表⽰:字符数组,栈。

中缀表达式:在程序语⾔中,运算符位于两个运算数中间的表达式称为中缀表达式,例如 1+2*3.中缀表达式运算规则:先乘除,后加减,从左到右,先括号内,后括号外,因此中缀表达式不仅要判断运算符的优先级,⽽且还有处理括号。

后缀表达式:运算符在运算数的后⾯,如1+2*3的后缀表达式:1 2 3*,在后缀表达式中已经考虑了运算符的优先级,没有括号,只有运算数和运算符。

后缀表达式的运算:按照运算符的次序进⾏的。

例如123*+,从左到右扫描时,第⼀个运算符为*,先执⾏2*3=6,第⼆个运算符为‘+’,执⾏1+6=7。

⼆ .表达式求值的过程:将算术表达式转换成后缀表达式,然后对后缀表达式求值。

1.将算术表达式转换为后缀表达式。

(1)从左到右⼀次扫描中缀表达式的每⼀个字符,如果是字符串,直接写⼊后缀表达式。

(2)如果遇到的是' ( ',则压⼊操作符栈,遇到‘(’时,将栈中的元素放到后缀表达式中,直达栈顶元素为'('时,将栈顶元素'('删除,不需要⼊栈。

(3)如果遇到的是操作符,则将操作符和操作符栈顶元素⽐较。

:如果a[i]的运算符的优先级⼩于等于栈顶元素的优先级,退栈运算符并放到后缀表达式中,直到a[i]的运算符优先级⼤于栈顶运算符的优先级:否则⼊栈。

(4)重复上述步骤,知道中缀表达式的结束符标记“#”,转换结束。

我的代码:#include<bits/stdc++.h>using namespace std;stack<char>f;//操作符栈stack<double>s;//操作数栈bool flag;int prior(char ch)//运算符的优先级{switch(ch){case'+':case'-':return 1;case'*':case'%':case'/':return 2;default:return 0;//括号}}string trans(string a){while(!f.empty()) f.pop();f.push('#');string ret="";//保存中缀表达式int len=a.size(),i=0;while(i<len){if(a[i]==' '||a[i]=='=')//??{i++;continue;}else if(a[i]=='(')f.push(a[i++]);else if(a[i]==')'){while(f.top()!='('){ret+=f.top();ret+=' ';f.pop();}f.pop();//(出栈i++;}else if(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'||a[i]=='%'){while(prior(f.top())>=prior(a[i]))//如果a[]的运算符的优先级⼩于等于栈顶元素的优先级,退栈运算符并放到后缀表达式中,直到a[i]的运算符优先级⼤于栈顶运算符的优先级ret+=f.top();ret+=' ';f.pop();}f.push(a[i++]);}else{while((a[i]>='0'&&a[i]<='9')||a[i]=='.'){ret+=a[i++];}ret+=' ';}}while(f.top()!='#'){ret+=f.top();ret+=' ';f.pop();}ret+='=';return ret;}double cal(double a,double b,double ch)//计算{if(ch=='+') return a+b;if(ch=='-') return a-b;if(ch=='*') return a*b;if(ch=='%') return ((int)a%(int)b);if(ch=='/'){if(b!=0)return a/b;flag=true;return 0;}}double solve(string a)//后缀表达式计算{string t=trans(a);while(!s.empty()) s.pop();flag=false;int len=t.length(),i=0;while(i<len){if(t[i]==' '||t[i]=='='){i++;continue;}else if(t[i]=='+'||t[i]=='-'||t[i]=='*'||t[i]=='/'||t[i]=='%') {double num1,num2;num1=s.top();s.pop();num2=s.top();s.pop();s.push(cal(num1,num2,t[i]));i++;}else{double x=0;while(t[i]>='0'&&t[i]<='9'){x=x*10+t[i]-'0';i++;}if(t[i]=='.'){double k=10.0,y=0;i++;while(t[i]>='0'&&t[i]<='9'){y+=((t[i]-'0')/k);i++;k*=10;;}x+=y;}s.push(x);}}return s.top();}int main(){int num;scanf("%d",&num);while(num--){cin>>a;// cout<<e.trans(a)<<endl;//将中缀表达式装换为后缀表达式 cout<<solve(a)<<endl;}return 0;}。

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

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

实验报告课程名:数据结构(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.熟悉常见表达式求值算法。

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.实验代码实现:________根据算法描述,使用编程语言实现一个表达式求值的程序。

表达式求值实验报告

表达式求值实验报告

表达式求值实验报告西南大学数据结构实验报告学院:专业:班级:姓名:学号:实验报告一、实验题目:表达式表达式二、实验目的和建议:目的:(1)通过该算法的设计思想,熟识栈的特点和应用领域方法;(2)通过对波函数优先法对算术表达式表达式的算法继续执行过程的模拟,认知在继续执行适当栈的操作方式时的变化过程。

(3)通过程序设计,进一步熟识栈的基本运算函数;(4)通过自己动手同时实现算法,强化从伪码算法至c语言程序的同时实现能力。

建议:(1)采用栈的顺序存储则表示方式;(2)采用波函数优先法;(3)用c语言同时实现;(4)从键盘输入一个符合要求的算术表达式,输入恰当的结果。

三、实验过程:#include#include#include#include#include#include#include#include#include#inclu de#include//函数结果状态代码#definetrue1#definefalse0#defineok1#defineerror0#defineinfeasible-1typedefintstatus;//status就是函数的类型,其值就是函数结果状态代码,如ok等typedefintelemtype;constintstack_init_size=100;constintstackincrement=10;typed efstruct{elemtype*base;elemtype*top;intstacksize;}stack;statusinitstack(stack&s){//构造一个空栈ss.base=(elemtype*)malloc(stack_init_size*sizeof(elemtype));if(!s.base)exit(er ror);s.top=s.base;s.stacksize=stack_init_size;returnok;}statuspush(stack&s,ele mtypee){//插入元素e为新的栈顶元素if(s.top-s.base>=s.stacksize){s.base=(elemtype*)realloc(s.base,(s.stacksize+stackincrem ent)*sizeof(elemtype));if(!s.base)exit(overflow);s.top=s.base+s.stacksize;s.st acksize+=stackincrement;}*s.top++=e;returnok;}statuspop(stack&s,elemtype&e){//若栈不空,则删除,用e返回其值,并返回ok;否则返回errorif(s.top==s.base)returnerror;e=*--s.top;returnok;}statusgettop(stack&s){//若栈不空,用e返回s的栈顶元素,并返回ok;否则返回errorif(s.top==s.base)returnerror;return*(s.top-1);}operate.h:#include\statusin(charc){//辨别c与否为运算符if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')returnok;elsereturnerror;}statusoper ate(inta,charc,intb){//二元运算switch(c){case'+':returna+b;break;case'-':returna-b;break;case'*':returna*b;break;case'/':if(b==0){printf(\(提示信息:存有除数为零错误)\\n\);returnerror;}//除数无法为零elsereturna/b;break;}}charprecede(chara,charb){//波函数间优先关系switch(a){case'+':switch(b){case'+':return'>';break;case'-':return'>';break;case'*':return'';break;case'#':return'>';break;}break;case'-':switch(b){case'+':return'>';break;case'-':return'>';break;case'*':return'';break;case'#':return'>';break;}break;case'*':switch(b){case'+':return'>';break;case'-':return'>';break;case'*':return'>';break;case'/':return'>';break;case'(':return'';break;case'#':return'>';break;}break;case'/':switch(b){case'+':return'>'; break;case'-':return'>';break;case'*':return'>';break;case'/':return'>';break;case'(':return'';break;case'#':return'>';break;}break;case'(':switch(b){case'+':return'';b reak;case'-':return'>';break;case'*':return'>';break;case'/':return'>';break;case')':return'>';break;case'#':return'>';break;}break;case'#':switch(b)。

数据结构表达式求值完整篇(含实验报告)

数据结构表达式求值完整篇(含实验报告)
voidOPND_Pop(Sqstack_OPND
&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);
//操作数栈初始化

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

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

数据结构表达式求值实验报告数据结构表达式求值实验报告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. 实验结果我们用中缀表达式\。

数据结构试验:栈和队列实验——表达式求值

数据结构试验:栈和队列实验——表达式求值

实验报告课程名称数据结构实验项目实验二--栈和队列实验系别___ _计算机学院 _ ______专业___ _计算机科学与技术___班级/学号__学生姓名 ____________实验日期成绩_______________________指导教师实验题目:实验二-----栈和队列实验一、实验目的1)掌握栈的顺序存储结构及队列的链式存储结构;2)验证栈的顺序存储结构的操作的实现;3)验证队列的链式存储结构的操作的实现;4)理解算法与程序的关系,能够将算法转换为对应程序。

二、实验内容1)建立一个顺序存储的空栈,并以此分别实现入栈、出栈、取栈顶元素;2)建立一个链式结构的空队列,并以此分别实现入队、出队、取队头等基本操作;3)尝试利用栈和队列的算法解决一些实际的应用问题。

设计与编码1)实验题目主要需求说明2)设计型题目:表达式求值(要求利用栈结构和运算符优先约定表,输入一个表达式,并计算求值)3)结合题目,说明利用栈或队列解决问题的基本算法描述4)程序源码#include<iostream>using namespace std;const int InitSize=100;const int IncreastSize=10;template<class datatype>class SqStack {private:datatype *base;datatype *top;int stacksize;public:SqStack();void DestroyStack();void ClearStack();int StackLength();bool IsEmpty();bool GetTop(datatype &e);bool Pop(datatype &e);bool Push(datatype e);};template<class datatype>SqStack<datatype>::SqStack(){base=new datatype[InitSize];if(!base)exit(1);top=base;stacksize=InitSize;}template<class datatype>void SqStack<datatype>::DestroyStack() {delete[] base;base=top=NULL;stacksize=0;}template<class datatype>void SqStack<datatype>::ClearStack() {top=base;}template<class datatype>int SqStack<datatype>::StackLength() {return top-base;}template<class datatype>bool SqStack<datatype>::IsEmpty() {if(top==base)return fasle;else return true;}template<class datatype>bool SqStack<datatype>::GetTop(datatype &e){if(top==base)return false;e=*(top-1);return true;}template<class datatype>bool SqStack<datatype>::Pop(datatype &e){if(top==base)return false;e=*(top-1);top--;return true;}template<class datatype>bool SqStack<datatype>::Push(datatype e){if(top-base>=stacksize){base=(datatype *)realloc( base , (stacksize+IncreastSize)*sizeof(int) ); if(!base)exit(1);top=base+stacksize;stacksize+=IncreastSize;}*(top)=e;top++;return true;}int com(char m,char t){if(t=='(') return -1;else if(t==')'){if(m=='+'||m=='-'||m=='*'||m=='/') return 1; else if(m=='(') return 0;else return -2;}else if(t=='*'||t=='/'){if(m=='+'||m=='-'||m=='#'||m=='(') return -1; else return 1;}else if(t=='+'||t=='-'){if(m=='#'||m=='(') return -1;else return 1;}else{if(m=='#')return 0;else if(m=='+'||m=='-'||m=='*'||m=='/') return 1; else return -2;}}void main(){SqStack <char> op;SqStack <double> re;char t,m;double result,flag=1;op.Push('#');t=getchar();while(true){if(t>='0'&&t<='9'){double s=0;s=s*10+t-'0';t=getchar();while(t>='0'&&t<='9' ){s=s*10+t-'0';t=getchar();}re.Push(s);}else if(t=='+'||t=='-'||t=='*'||t=='/'||t=='('||t==')'||t=='\n') { op.GetTop(m);while(com(m,t)==1 ){double x1,x2;op.Pop(m);if(re.Pop(x2)&&re.Pop(x1)){if(m=='+') re.Push(x1+x2);else if(m=='-') re.Push(x1-x2);else if(m=='*') re.Push(x1*x2);else if(m=='/') {if(x2!=0)re.Push(x1/x2); else flag=0;} }else flag=0;op.GetTop(m);}if(com(m,t)==-1)op.Push(t);else if(com(m,t)==0)op.Pop(m);else flag=0;if(!op.GetTop(m)) break;t=getchar();}else t=getchar();}if(re.GetTop(result)&&flag)cout<<result<<endl;else cout<<"Input error!\n";}5)运行结果三、总结与心得。

《数据结构课程设计》表达式求值实验报告

《数据结构课程设计》表达式求值实验报告

实验课程名称专业班级学生姓名学号指导教师20 至 20 学年第学期第至周算术表达式求值演示一、概述数据结构课程设计.要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面.加深对课程基本内容的理解。

同时.在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

在这次的课程设计中我选择的题目是算术表达式求值演示。

表达式计算是实现程序设计语言的基本问题之一.也是栈的应用的一个典型例子。

设计一个程序.演示用算符优先法对算术表达式求值的过程。

深入了解栈和队列的特性.以便在解决实际问题中灵活运用它们.同时加深对这种结构的理解和认识。

二、系统分析1.以字符列的形式从终端输入语法正确的、不含变量的整数表达式。

利用已知的算符优先关系.实现对算术四则混合运算表达式的求值.并仿照教科书的例子在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。

2.一般来说.计算机解决一个具体问题时.需要经过几个步骤:首先要从具体问题抽象出一个适当的数学模型.然后设计一个解决此数学模型的算法.最后编出程序.进行测试.调试直至得到想要的答案。

对于算术表达式这个程序.主要利用栈.把运算的先后步骤进行分析并实现简单的运算!为实现算符优先算法.可以使用两个栈.一个用以寄存运算符.另一个用以寄存操作数和运算结果。

3.演示程序是以用户于计算机的对话方式执行.这需要一个模块来完成使用者与计算机语言的转化。

4.程序执行时的命令:本程序为了使用具体.采用菜单式的方式来完成程序的演示.几乎不用输入什么特殊的命令.只需按提示输入表达式即可。

(要注意输入时格式.否者可能会引起一些错误)5. 测试数据。

三、概要设计一个算术表达式中除了括号、界限符外.还包括运算数据和运算符。

由于运算符有优先级别之差.所以一个表达式的运算不可能总是从左至右的循序执行。

每次操作的数据或运算符都是最近输入的.这与栈的特性相吻合.故本课程设计借助栈来实现按运算符的优先级完成表达式的求值计算。

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

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

数据结构表达式求值实验报告数据结构表达式求值实验报告⒈引言本实验旨在研究和实现数据结构中表达式求值的算法。

表达式求值是计算机科学中常见的问题,对于计算机程序的正确性和性能具有重要影响。

本报告将详细介绍实验设计、实验步骤、实验结果及分析,并对实验过程中遇到的问题进行讨论。

⒉实验设计⑴实验目的本实验的目的是实现一个可以对常见的算术表达式进行求值的算法,包括支持基本的加减乘除运算符和括号。

⑵实验环境●操作系统:Windows 10●开发语言:C++●开发工具:Visual Studio 2019⑶数据结构设计为了实现表达式求值的算法,我们需要设计适当的数据结构来存储和处理表达式。

本实验中,我们选择使用栈来实现表达式求值。

●表达式栈:用于存储操作数和运算符。

●运算符栈:用于存储运算符。

⑷算法设计表达式求值的算法可以分为以下几个步骤:●遍历表达式,逐个处理操作数和运算符:●如果是操作数,入表达式栈。

●如果是运算符,与运算符栈栈顶元素进行比较,根据优先级决定如何处理。

●当表达式遍历完成后,依次处理剩余的运算符。

●最终表达式栈中的元素即为求值结果。

⒊实验步骤⑴数据结构实现根据设计,我们首先实现表达式栈和运算符栈的数据结构,包括入栈、出栈等操作。

⑵表达式输入与预处理用户输入待求值的表达式,进行预处理,去除空格、验证表达式的合法性等。

⑶表达式求值算法实现根据前述的算法设计,实现表达式求值的算法,利用表达式栈和运算符栈来处理表达式。

⑷测试与结果分析对于不同的测试用例,进行表达式求值的测试,并分析结果的正确性和性能。

⒋实验结果与分析经过实验测试,我们得到了表达式求值的结果。

结果显示,我们的算法能够正确地求得表达式的值,而且性能良好。

⒌讨论与总结在实验过程中,我们遇到了一些问题,并进行了讨论和解决。

通过这个实验,我们更加深入地理解了表达式求值的算法,并对数据结构的应用有了更清晰的认识。

附件:无法律名词及注释:●无。

数据结构实验二——算术表达式求值实验报告

数据结构实验二——算术表达式求值实验报告

数据结构实验二——算术表达式求值实验报告算术表达式求值实验报告一、引言算术表达式求值是计算机科学中一个重要的基础问题,它涉及到了数据结构和算法的应用。

本实验旨在通过实现一个算术表达式求值的程序,加深对数据结构中栈的理解和应用,并掌握算术表达式的求值过程。

二、实验目的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.课题分析 .....................................................................1.1需求分析..............................................................1. 2设计要求............................................................2.总体设计.......................................................................2.1主程序的流程.....................................................3.详细设计(步骤及代码实现) ...................................3. 1判断运算符优先级..............................................3. 2中缀表达式转后缀表达式..................................3. 3后缀表达式求值.................................................. 4.测试结果 .................................................................... 5.心得体会 .................................................................... 6.参考文献 ....................................................................1.课题分析1.1需求分析(1)栈“后进先出”的特点。

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

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

实验二表达式求值
实验内容:
用算符优先法设计一个具有加、减、乘、除四功能的计算程序。

实验目的与要求:
掌握栈的数据结构和基本操作。

实验原理:
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.程序不够简洁,还有待改进,功能还有待更完善。

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

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

数据结构表达式求值实验报告一、实验目的本次实验的主要目的是通过实现表达式求值的程序,深入理解数据结构和算法在解决实际问题中的应用。

具体包括掌握栈这种数据结构的操作和使用,熟悉表达式的转换和计算过程,提高编程能力和问题解决能力。

二、实验环境本次实验使用的编程语言为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”等,程序能够正确地将其转换为后缀表达式,并计算出结果。

数据结构表达式求值完整篇(含实验报告)

数据结构表达式求值完整篇(含实验报告)
1.栈的定义、初始化、出栈进栈、取栈顶元素等步骤不难就先把结构打好了
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!二、概要设计拟采用两种类型的展分别对操作数和操作符进行操作。

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

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

数据结构表达式求值实验报告关键信息项:1、实验目的:____________________________2、实验环境:____________________________3、实验原理:____________________________4、实验步骤:____________________________5、测试用例及结果:____________________________6、实验总结:____________________________11 实验目的本实验的主要目的是通过使用数据结构和算法来实现表达式求值的功能,加深对栈、队列等数据结构的理解和运用,提高编程能力和解决实际问题的能力。

111 具体目标包括掌握中缀表达式转换为后缀表达式的方法。

利用栈结构实现后缀表达式的求值运算。

能够处理表达式中的运算符优先级和括号。

12 实验环境本次实验使用的编程环境为具体编程语言和版本,在操作系统名称操作系统上进行。

121 所需软件和工具编程软件名称:用于编写和调试代码。

测试工具名称:用于对程序进行测试和验证。

13 实验原理表达式求值是程序设计中的一个常见问题。

中缀表达式符合人们的日常书写习惯,但直接求值较为复杂。

将中缀表达式转换为后缀表达式后,求值过程会变得更加简单和直观。

131 中缀转后缀表达式的原理遇到操作数,直接输出。

遇到运算符,将其与栈顶运算符进行优先级比较。

若优先级高于栈顶运算符,则入栈;否则,弹出栈顶运算符并输出,直到当前运算符优先级高于栈顶运算符或栈为空,然后将当前运算符入栈。

遇到左括号,直接入栈。

遇到右括号,弹出栈顶运算符并输出,直到遇到左括号,左括号出栈但不输出。

132 后缀表达式求值的原理从左到右扫描后缀表达式。

遇到操作数,压入栈中。

遇到运算符,从栈中弹出两个操作数,进行相应运算,将结果压入栈中。

扫描结束后,栈顶元素即为表达式的结果。

14 实验步骤141 数据结构设计定义一个栈来存储运算符。

算是表达式栈实验报告

算是表达式栈实验报告

中南大学《数据结构与算法》课程实验实验报告题目线性表的操作学生姓名张悦学生学号 3901090516 专业班级软件工程0905班实验二栈的基本操作一、实验目的熟练掌握栈的基本操作:初始化栈、判栈为空、出栈、入栈等运算。

理解栈在数据处理中扮演的角色,运用栈结构实现具体的应用。

二、实验内容栈是数据结构中一个非常重要的结构。

表达式计算是掌握程序设计语言的重要部分之一,也是栈的应用的一个典型例子。

本次实验的主要内容是利用栈的基本操作,设计一个程序,实现用算符优先法对算术表达式求值的过程。

对本设计系统实现+、-、*、/、%和乘方(^)运算。

符合要求,同时提高自己的编程能力。

实现算术表达式求值。

选作内容:提供对小数点的支持,允许输入的表达式中出现多位数字和小数点。

三、实验要求1.认真阅读和掌握本实验的算法。

2.上机将本算法实现。

3.在程序的编写中尽量与专业的编程规范靠拢,系统代码采用结构化的编程方式,力求设计代码以及注释等规范,4.保存和打印出程序的运行结果,并结合程序进行分析。

一.需求分析本程序用于计算“+”、“-”、“*”、“\”、“^”、“()”的简单计算器,对简单的计算式子进行计算,并输出运算结果。

1.输入的形式和输入值的范围:整数类型的实数(float),并以“#”对每个式子结尾;2.输出的形式:算式的最后结果;3.程序所能达到的功能:计算出所输入运算式子的结果;4.测试数据:①正确输入:(3+4)*5#输出结果:35②错误输入:没有以“#”结尾、除数为0、输入了除“+”、“-”、“*”、“\”、“^”、“()”意外的运算符、括号的左右不匹配、数据溢出等。

输出结果:“Operator error!”、“Divide zero!”、“Input error, Retry!”、“Out of space!”二.概要设计栈的储存结构:此方法中用到的抽象数据类型为结构体:struct STACK1{ //此为操作符的栈;char sta[MAX];int top;};typedef struct STACK1 stack1;struct STACK2{ //此为运算数的栈;float sta[MAX];int top;};typedef struct STACK2 stack2;主程序中提示输入所需要计算的运算公式,调用check_ch函数检查输入是否错误,然后调用operate函数计算所输入算式的计算所得结果;其中在operate函数中还调用了pop、push、Output等函数对所输入的运算公式进行计算。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

8 / 20
版权归原作者 Amber 所有
break; } } return GetTop2(OPND); } int main( ) { printf("请输入正确的表达式以'#'结尾:"); do{ gets(expr); }while(!*expr); InitStack(&OPTR); /* 初始化运算符栈 */ Push(&OPTR,'#'); /* 将#压入运算符栈 */ InitStack2(&OPND); /* 初始化操作数栈 */ printf("表达式结果为:%d\n", EvalExpr()); return 0; }
6 / 20
版权归原作者 Amber 所有
case '+' : return (a+b); case '-' : return (a-b); case '*' : return (a*b); case '/' : return (a/b); } return 0; } 8、返回操作数的长度 int num(int n) { char p[10]; itoa(n,p,10);//把整型转换成字符串型 n=strlen(p); return n; } 9、主要操作函数 int EvalExpr() { char c,theta,x; int n,m; int a,b; c = *ptr++; while(c!='#'||GetTop(OPTR)!='#') {
版权归原作者 Amber 所有
数据结构与数据库 实验报告
题 院 姓 学

表达式求值 (栈)
系 化学与材料科学学院 化学物理系 名 号
***** ********** 司 虎 2011 年 12 月 5 日 星期三
指导老师 提交时间
1 / 20
版权归原作者 Amber 所有
一 实验内容
用算符优先法设计一个具有加、减、乘、除四功能的计算程序。
二 目的与要求
掌握栈的数据结构和基本操作,实现中缀算术表达式四则计算。
三 实验算法
1、定义全局变量 Stack OPTR;/* 定义运算符栈*/ Stack2 OPND; /* 定义操作数栈 */ char expr[255] = ""; /* 存放表达式串 */ char *ptr = expr; 2、构造运算符栈 int InitStack(Stack *s) { s->base=(char *)malloc(STACK_INIT_SIZE*sizeof(char)); if(!s->base) return ERROR; s->top=s->base; s->stacksize=STACK_INIT_SIZE; return OK; } 3、构造操作数栈 int InitStack2(Stack2 *s) { 2 / 20
int InitStack(Stack *s) //构造运算符栈 { s->base=(char *)malloc(STACK_INIT_SIZE*sizeof(char)); if(!s->base) return ERROR; s->top=s->base; s->stacksize=STACK_INIT_SIZE; return OK; } int InitStack2(Stack2 *s) //构造操作数栈 { s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int)); if(!s->base) return ERROR; s->stacksize=STACK_INIT_SIZE;
5 / 20
版权归原作者 Amber 所有
case '(' : i=4;break; case ')' : i=5;break; case '#' : i=6;break; }
switch(c2) { /* j 为下面 array 的纵标 */ case '+' : j=0;break; case '-' : j=1;break; case '*' : j=2;break; case '/' : j=3;break; case '(' : j=4;break; case ')' : j=5;break; case '#' : j=6;break; } return (array[7*i+j]); /* 返回运算符 */ } 7、操作函数 int Operate(int a,char op,int b) { switch(op) {
五 实验结果与分析
上述程序在 Visual C++ 6.0 环境下加以实现。经过多次测试,程序运 行正确。结果如图: 10 / 20
版权归原作者 Amber 所有
11 / 20
版权归原作者 Amber 所有
六 心得体会
1、这次课程设计让我了解到大一学到的 C 语言与本学期学到的数据结构紧 密相关。 2、课设题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计 者有较强的思维和动手能力和更加了解编程思想和编程技巧。
4 / 20
版权归原作者 Amber 所有
{ int p=*(s.top-1); return p; } 6、判断运算符优先权,返回优先权高的运算符 char Precede(char c1,char c2) { int i=0,j=0; static char array[49]={ '>', '>', '<', '<', '<', '>', '>', '>', '>', '<', '<', '<', '>', '>', '>', '>', '>', '>', '<', '>', '>', '>', '>', '>', '>', '<', '>', '>', '<', '<', '<', '<', '<', '=', '!', '>', '>', '>', '>', '!', '>', '>', '<', '<', '<', '<', '<', '!', '='}; switch(c1) { ቤተ መጻሕፍቲ ባይዱ* i 为下面 array 的横标 */ case '+' : i=0;break; case '-' : i=1;break; case '*' : i=2;break; case '/' : i=3;break;
四 程序结构
1、数据结构 typedef struct{ int stacksize; char *base; char *top; 9 / 20 // 定义字符类型栈
版权归原作者 Amber 所有
} Stack; typedef struct{ int stacksize; int *base; int *top; } Stack2; 2、函数功能说明 int InitStack(Stack *s) //构造运算符栈 int InitStack2(Stack2 *s) //构造操作数栈 int In(char ch) //判断字符是否是运算符,运算符即返回 1 int Push(Stack *s,char ch) //运算符栈插入 ch 为新的栈顶元素 int Push2(Stack2 *s,int ch)//操作数栈插入 ch 为新的栈顶元素 char Pop(Stack *s) //删除运算符栈 s 的栈顶元素,用 p 返回其值 int Pop2(Stack2 *s)//删除操作数栈 s 的栈顶元素,用 p 返回其值 char GetTop(Stack s)//用 p 返回运算符栈 s 的栈顶元素 int GetTop2(Stack2 s) //用 p 返回操作数栈 s 的栈顶元素 char Precede(char c1,char c2) //判断运算符优先权,返回优先权高的 int Operate(int a,char op,int b) //操作函数 int num(int n)//返回操作数的长度 int EvalExpr()//主要操作函数 //定义整型栈
七 实验源程序
#include <stdio.h> #include <stdlib.h> #include <string.h> #define NULL 0 #define OK 1 #define ERROR -1 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 20 /* 定义字符类型栈 */ typedef struct{ int stacksize; char *base; char *top; } Stack; /* 定义整型栈 */ typedef struct{ 12 / 20
相关文档
最新文档