实验三的实验报告学期: 2010 至_2011 第 2 学期 2011年 3月 27日课程名称: 数据结构专业:信息与计算科学 09 级5班实验编号: 03 实验项目:栈和队列实验指导教师 _冯山_姓名:朱群学号: 2009060548 实验成绩:一实验目的:(1)熟练掌握栈和队列的抽象数据类型及其结构特点;(2)实现基本的栈和队列的基本操作算法程序。
二实验内容:(类C算法的程序实现,任选其一)(1) 设计与实现基本的堆栈和队列结构下的各种操作(如堆栈的PUSH、POP 等操作)(必做);(2)以表达式计算为例,完成一个可以进行算术表达式计算功能的算法设计与实现(选做);(3)以迷宫问题为例,以堆栈结构完成迷宫问题的求解算法和程序(选做)。
三实验准备:1) 计算机设备;2)程序调试环境的准备,如TC环境;3)实验内容的算法分析与代码设计与分析准备。
四实验步骤:1.录入程序代码并进行调试和算法分析;2.编写实验报告。
五实验过程一设计与实现基本的堆栈结构下的各种操作(如堆栈的PUSH、POP等操作)(1)问题描述实现堆栈各种基本操作,如Pop,Push,GetTop等操作,即输入数据,通过Push入栈,再通过Pop操作输出出栈的元素,即入栈a,b,c,d,出栈d,c,b,a (2)算法实现及基本思想堆栈是后进先出的线性表,由Push输入元素,Pop输出元素,堆栈的Push 操作思想,即插入元素e为新的的栈顶元素,先判断栈满与否,追加存储空间,然后将e值赋给栈顶指针Top。
输入数据时用for循环堆栈的Pop操作思想,先判断栈是否为空,若栈不空,则删除栈的栈顶元素,用e返回其值,(3)数据结构栈的顺序存储结构Typedef struct{SelemType *base;//栈底指针,在栈构造之前和销毁之后,base的值为NULLSelemType *top;//栈顶指针int stacksize;//当前已分配的存储空间,以元素为单位。
}SqStack;(4)算法描述//构造一个空栈Status InitStack(SqStack &S)//构造一个空栈S{S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SelemType));If(!S.base) exit(OVERFLOW);//存储分配失败S.top=S.base;S.stacksize=STACK_INIT_SIZE;Return OK;}Status GetTop(SqStack S,SelemType &e)//若栈不空,则用e返回S的栈顶元素,并返回OK,否则返回Error{if (S.base==S.top) return ERROR;e= *(S.top-1);return OK;}Status Push(SqStack &S,SelemType e)//插入元素e为新的栈顶元素,即压栈{if(S.top-S.base>=S.stacksize)S.base=(SelemType *)realloc(S.base,(S.stacksize+STACKINCREAMENT)*sizeof(SelemType));if(!S.base) exit(OVERFLOW)S.top=S.base+S.stacksize;S.stacksize+=STACKINCREAMENT;*S.top++=e;}Status Pop((SqStack &S,SelemType &e)//删除s的栈顶元素,用e返回其值{if(S.top==S.base) return ERROR;e=* --S.top;return OK;}Status StackEmpty(SqStack S)//空栈的判定{if(S.top=S.base) return TURE;else return FALSE;}(5)程序的源代码堆栈的Pop和Push操作源代码:#include<stdio.h>#include<stdlib.h>#define OVERFLOW 1#define OK 2#define ERROR 0#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef struct{int *base;int *top;int stacksize;}Sqstack;int Initstack(Sqstack *S){S->base=(int *)malloc(STACK_INIT_SIZE * sizeof(int));if(!S->base) exit(OVERFLOW);S->top=S->base;S->stacksize=STACK_INIT_SIZE;return OK;}int Push(Sqstack *S,int e){if(S->top-S->base>=S->stacksize){S->base=(int*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(int));if(!S->base) exit(OVERFLOW);S->top=S->base+S->stacksize;S->stacksize+=STACKINCREMENT;}*(S->top++)=e;return OK;}int Pop(Sqstack *S,int *e){if(S->top==S->base) return ERROR;*e=*(--S->top);return OK;}void main(){Sqstack S;int i,j,e;clrscr();Initstack(&S);printf("please input the number of the stack:");scanf("%d",&j);for(i=0;i<j;i++){scanf("%d",&e);Push(&S,e);}printf("The sequence of the stack:\n");for(i=0;i<j;i++){Pop(&S,&e);printf("%d\n",e);}}(6)代码测试1)当进栈元素为有序的{1,3,4},出栈元素为{4,3,1},结果正确2)当进栈元素为无序的{5,8,2},出栈元素为{2,8,5}正确(7)测试分析由上述代码测试结果可知,堆栈的输入和输出与元素有序或者无序没有关系,且都是由后进先出的顺序输出。
(8)进一步改进二队列结构下的基本操作(1)问题描述实现队列的各种基本操作,如EnQueue,DeQueue等操作,即输入数据,通过EnQueue入队,再通过DeQueue操作输出队列的元素,即入队元素为a,b,c,d, 出队元素为a,b,c,d(2)算法实现及基本思想队列是一种先进先出的线性表,由EnQueue输入队列元素,DeQueue输出队列元素(3)数据结构队列的链式存储结构typedef struct Qnode{QelemType data;Struct Qnode *next;}Qnode,*QueuePtr;typedef struct{QueuePtr front;//队头指针QueuePtr rear;//队尾指针}linkQueue;(4)算法描述//构造一个空队列int InitQueue(LinkQueue Q){Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));if(!Q.front) exit(OVERFLOW);Q.front->next=NULL;return OK;}//插入元素e为队列Q的新的队尾元素int EnQueue(LinkQueue Q,int e){LinkQueue p;p=(QueuePtr *)malloc(sizeof(QNode));if(!p) exit(OVERFLOW);p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;return OK;}//出队,删除Q的队头元素,用e返回其值int DeQueue(LinkQueue Q,int *e){LinkQueue p;if(Q.front==Q.rear) return ERROR;p=Q.front->next;e=p->data;Q.front->next=p->next;if(Q.rear==p) Q.rear=Q.front;free(p);return OK;}(5)程序的源代码队列的EnQueue和DeQueue操作源代码:#include<stdio.h>#define NULL 0#define OVERFLOW 1#define OK 2#define ERROR 0typedef struct QNode{int data;struct QNode *next;}QueuePtr;typedef struct{QueuePtr *front;QueuePtr *rear;}LinkQueue;int InitQueue(LinkQueue *Q){Q->front=Q->rear=(QueuePtr *)malloc(sizeof(QueuePtr)); if(!Q->front) exit(OVERFLOW);Q->front->next=NULL;return OK;}int EnQueue(LinkQueue *Q,int e){QueuePtr *p;p=(QueuePtr *)malloc(sizeof(QueuePtr));if(!p) exit(OVERFLOW);p->data=e;p->next=NULL;Q->rear->next=p;Q->rear=p;return OK;}int DeQueue(LinkQueue *Q,int *e){QueuePtr *p;if(Q->front==Q->rear) return ERROR;p=Q->front->next;*e=p->data;Q->front->next=p->next;if(Q->rear==p) Q->rear=Q->front;free(p);return OK;}int main(void){LinkQueue Q;int i,j,e;clrscr();InitQueue(&Q);printf("please input the length of LinkQueue:");scanf("%d",&j);for(i=0;i<j;i++){ scanf("%d",&e);EnQueue(&Q,e);}printf("The result is:\n");for(i=0;i<j;i++){DeQueue(&Q,&e);printf("%d\n",e);}return 0;}(6)代码测试队列测试,输入入队元素为{1,5,3,1},出队元素为{1,5,3,1},运行正确。