数据结构实验报告栈操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》实验报告
◎实验题目: 栈的应用。
◎实验目的:熟悉掌握对栈的应用和基本操作。
◎实验内容:用算符优先法对算术表达式求值。
一、需求分析
通过程序设计实现算符优先法:
1 以字符串的形式输入整形数据和运算符号;
2、输出算术表达式的结果;
3、实现简单的一位整型数据的算术运算;
4、测试数据:算术表达式,其中的整型数据均只有一位。
二概要设计
1.基本操作
void InitStack(SqStack *s)
操作结果:栈的初始化。
int GetTop(SqStack *s)
初始条件:栈已存在且不空;
操作结果:将栈顶元素返回。
void Push(SqStack *s,int e)
初始条件:栈已存在;
操作结果:插入e作为新的栈顶元素。
char Pop1(SqStack *s)
初始条件:运算符栈已存在且不空;
操作结果:栈顶元素出栈。
int Pop2(SqStack *s)
初始条件:运算数栈已存在且不空;
操作结果:栈顶元素出栈。
char precede(char A, char B)
操作结果:比较两个算符的优先级,并将比较结果返回。
int In(char Test)
操作结果:判断字符是否是运算符。
int EvaluateExpression()
操作结果:通过调用一系列的函数,对表达式求值。
main()
操作结果:主要通过调用函数EvaluateExpression得到最终结果。2.本程序包含两个模块:
(1)构造栈的模块;
(2)主程序模块;
(三) 详细设计
1.声明,栈的结构体和判断运算符优先级的表格(以数组形式表达):
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define overflow 1
#define error 0
char OPSET[7]={'+' , '-' , '*' , '/' ,'(' , ')' , '#'};//运算符种类unsigned char Prior[7][7] =
{ // 算符间的优先关系 '>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','>','<','>','>',
'>','>','>','>','<','>','>',
'<','<','<','<','<','=',' ',
'>','>','>','>',' ','>','>',
'<','<','<','<','<',' ','='
};
2.各个函数的详细设计:
void InitStack(SqStack *s)//栈的初始化
{
s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
if(!s->base) exit(error); //存储分配失败
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
}
int GetTop(SqStack *s)//若运算符栈不空则用e返回栈顶元素
{
if(s->top==s->base)
exit (overflow);
return (*(s->top-1));
}
void Push(SqStack *s,int e)//插入e为新的栈顶元素
{
if(s->top-s->base>=s->stacksize)
{
s->base=(int
*)realloc(s->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(int));
if(!s->base)exit(error);
s->top=s->base+s->stacksize;;
s->stacksize=s->stacksize+STACKINCREMENT;
}
*s->top=e;
s->top++;
}
char Pop1(SqStack *s)//运算符栈顶元素出栈
{
if(s->top==s->base)
return error;
return (*--s->top);
}
int Pop2(SqStack *s)//运算数栈顶元素出栈
{
if(s->top==s->base)
return error;
return (*--s->top);
}
char Precede(char A, char B) //实现两个算符优先级的比较
{
return Prior[FindOpOrd(A,OPSET)][FindOpOrd(B,OPSET)];
}
在Precede函数中再调用FindOpOrd函数,设计如下:
int FindOpOrd(char op,char *TestOp) //在Prior数组中按行或者按列找到算符对应的位置{
int i;
for(i=0; i< 7; i++)
{
if (op == TestOp[i])
return i;
}
}
int Operate(int a,unsigned char theta, int b) //根据运算符进行二元运算
{
switch(theta)
{
case '+': return a+b;
case '-': return a-b;
case '*': return a*b;
case '/': if(b!=0)
return a/b;
else
exit(error);
default : return error;
}
}
int In(char Test) //判断字符是否为运算符,如果是运算符返回1,否则返回0
{
if('0'<=Test&&Test<='9')
return 0;