数据结构实验报告栈操作

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档