淮海工学院数据结构第2次实验.docx
《淮海工学院数据结构第2次实验.docx》由会员分享,可在线阅读,更多相关《淮海工学院数据结构第2次实验.docx(13页珍藏版)》请在冰豆网上搜索。
![淮海工学院数据结构第2次实验.docx](https://file1.bdocx.com/fileroot1/2022-11/26/c4d3906c-2c35-4a2b-a94f-49c871331fde/c4d3906c-2c35-4a2b-a94f-49c871331fde1.gif)
淮海工学院数据结构第2次实验
淮海工学院计算机科学系
实验报告书
课程名:
《数据结构》
题目:
线性数据结构实验
(栈与对立队列及其应用)
班级:
学号:
2012122693
姓名:
线性表算法实现与应用报告要求
1目的与要求:
1)掌握栈与队列的数据类型描述及特点;
2)掌握栈的顺序和链式存储存表示与基本算法的实现;
3)掌握队列的链式和循环存储表示与基本操作算法实现;
4)掌握栈与队列在实际问题中的应用和基本编程技巧;
5)按照实验题目要求,独立完成实际程序的编写编写、调试和运行,并通过用例数的运行过程抓获相关屏面验证程序设计的正确性;
7)由于国庆节占用授课时间,所以本次实验将不做统一上机安排,要求同学们节日期间自行完成实验任务,并于第6周周4以前按时提交实验报告。
2实验内容或题目
(一)必做题:
1、实现顺序栈的创建(初始化)、压入(插入)、弹出(删除)操作(数据元素类型自己选取,如整型、字符型等),并给出栈的每次操作变化状态;
2、实现链栈的创建(初始化)、压入(插入)、弹出(删除)操作(数据元素类型自己选取,如整型、字符型等),要求给出栈的操作变化过程;
3、实现循环队列的创建、进队、出队等基本操作(数据元素类型自己选取,如整型、字符型等),并实时给出队列的操作变化状态;
4、实现链式队列的创建、进队、出队等基本操作(数据元素类型自己选取,如整型、字符型等),并实时给出队列的操作变化状态;
(二)选做题(视自己能力而定,数量不限):
任选一个或多个源程序(已经发给学委),并阅读、调试和运行程序,而后给出程序功能分析和实例运行演示;
1、实现表达式求值算法程序;
2、用递归算法实现汉诺塔问题算法程序;
3、使用循环队列实现打印杨辉三角形算法程序。
3实验步骤与源程序
第一题:
#include
#include
#defineTRUE1
#defineFALSE0
#defineSize50
typedefstruct
{
intelem[Size];
inttop;
}SeqStack;
voidInitStack(SeqStack*S)
{
S->top=-1;
}
intIsEmpty(SeqStack*S)
{
return(S->top==-1?
TRUE:
FALSE);//判断栈空为空是真反之为假
}
intIsFull(SeqStack*S)
{
return(S->top==Size-1?
TRUE:
FALSE);//判断栈满为满是真反之为假
}
intPush(SeqStack*S,intx)//压栈
{
if(S->top==Size-1)
return(FALSE);
S->top++;
S->elem[S->top]=x;
return(TRUE);
}
intPop(SeqStack*S,int*x)//弹出
{
if(S->top==-1)
return(FALSE);
else
{
*x=S->elem[S->top];
S->top--;
return(TRUE);
}
}
voidmain()
{
SeqStackS;
intx,y,i,l;
InitStack(&S);
if(!
IsFull(&S))
printf("栈空:
\n");
printf("输入要压入的元素个数(50以内):
\n");
scanf("%d",&l);
printf("输入要压入的元素:
\n");
for(i=0;i{
scanf("%d",&y);
Push(&S,y);
}
printf("弹出:
\n");
while(!
IsEmpty(&S))
{
Pop(&S,&x);
printf("%d\n",x);
}
}
第二题:
#defineTRUE1
#defineFALSE0
#include
#include
typedefstructnode
{
intdata;
structnode*next;
}LinkStackNode;
typedefLinkStackNode*LinkStack;
intIsEmpty(LinkStackS)
{
returnNULL==S->next?
TRUE:
FALSE;
}
intInitStack(LinkStack*S)
{
*S=(node*)malloc(sizeof(node));
if(NULL==*S)
returnFALSE;
(*S)->next=NULL;
returnTRUE;
}
intPush(LinkStackS,intx)
{
LinkStackNode*temp;
temp=(LinkStackNode*)malloc(sizeof(LinkStackNode));
if(temp==NULL)
return(FALSE);
temp->data=x;
temp->next=S->next;
S->next=temp;
return(TRUE);
}
intPop(LinkStackS,int*x)
{
LinkStackNode*temp;
temp=S->next;
if(temp==NULL)
return(FALSE);
S->next=temp->next;
*x=temp->data;
free(temp);
return(TRUE);
}
voidmain()
{
LinkStackNode*s;
InitStack(&s);
intx,i,l;
if(IsEmpty(s))
printf("栈空\n");
printf("请输入压入元素个数(50以内):
\n");
scanf("%d",&l);
printf("请输入压入元素:
\n");
for(i=0;i{
scanf("%d",&x);
Push(s,x);
}
printf("弹出:
\n");
while(!
IsEmpty(s))
{
Pop(s,&x);
printf("%d\n",x);
}
}
第三题:
#include
#include
#defineTRUE1
#defineFALSE0
#defineMAXSIZE50
typedefstruct
{
intelement[MAXSIZE];
intfront;
intrear;
}SeqQueue;
voidInitQueue(SeqQueue*Q)
{
Q->front=Q->rear=0;
}
intEnterQueue(SeqQueue*Q,intx)
{
if((Q->rear+1)%MAXSIZE==Q->front)
return(FALSE);
Q->element[Q->rear]=x;
Q->rear=(Q->rear+1)%MAXSIZE;
return(TRUE);
}
intDeleteQueue(SeqQueue*Q,int*x)
{
if(Q->front==Q->rear)
return(FALSE);
*x=Q->element[Q->front];
Q->front=(Q->front+1)%MAXSIZE;
return(TRUE);
}
intIsEmpty(SeqQueue*Q)
{
if(Q->front==Q->rear)
return(TRUE);
else
return(FALSE);
}
voidmain()
{
SeqQueues;
InitQueue(&s);
intx,i,l;
if(IsEmpty(&s))
printf("此时为空队列\n");
printf("请输入进队元素个数\n");
scanf("%d",&l);
printf("请输入元素\n");
for(i=0;i{
scanf("%d",&x);
EnterQueue(&s,x);
}
printf("出队:
\n");
while(!
IsEmpty(&s))
{
DeleteQueue(&s,&x);
printf("%d\n",x);
}
if(IsEmpty(&s))
printf("此时为空队列\n");
}
第四题:
#include
#include
#defineTRUE1
#defineFALSE0
typedefstructNode
{
intdata;
structNode*next;
}LinkQueueNode;
typedefstruct
{
LinkQueueNode*front;
LinkQueueNode*rear;
}LinkQueue;
intIsEmpty(LinkQueue*Q)
{
returnQ->front==Q->rear?
TRUE:
FALSE;
}
intInitQueue(LinkQueue*Q)
{
Q->front=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));
if(Q->front!
=NULL)
{
Q->rear=Q->front;
Q->front->next=NULL;
return(TRUE);
}
elsereturn(FALSE);
}
intEnterQueue(LinkQueue*Q,intx)
{
LinkQueueNode*NewNode;
NewNode=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));
if(NewNode!
=NULL)
{
NewNode->data=x;
NewNode->next=NULL;
Q->rear->next=NewNode;
Q->rear=NewNode;
return(TRUE);
}
elsereturn(FALSE);
}
intDeleteQueue(LinkQueue*Q,int*x)
{
LinkQueueNode*p;
if(Q->front==Q->rear)
return(FALSE);
p=Q->front->next;
Q->front->next=p->next;
if(Q->rear==p)
Q->rear=Q->front;
*x=p->data;
free(p);
return(TRUE);
}
voidmain()
{
LinkQueueq;
intx,i,l;
InitQueue(&q);
if(IsEmpty(&q))
printf("此时为空队列\n");
printf("请输入进队元个数素\n");
scanf("%d",&l);
printf("请输入元素:
\n");
for(i=0;i{
scanf("%d",&x);
EnterQueue(&q,x);
}
printf("出队:
\n");
for(i=0;i{
DeleteQueue(&q,&x);
printf("%d\n",x);
}
if(IsEmpty(&q))
printf("此时为空队列\n");
}
4测试数据与实验结果(可以抓图粘贴)
5结果分析与实验体会
开始在编写第一题时,将所有代码完成后一直报错,反复检查代码没有错误,后来看到头文件名是#include因为C++习惯导致错误,后来改为就正确了,而且这些题目都是很基础的题目,在之后的编程中也遇到很多问题,如在第一题输出用printf("%d\n",&x);时,无报错,但输出是奇怪数值,绞尽脑汁都找不出问题所在,但是我注意到输出的数值都是一样的,猜测到可能是printf("%d\n",&x);中&x是错误,改为printf("%d\n",x);后正确,可是还是说不出具体的原因,这些都表明自己的基础差,还需要多巩固基础知识。
通过这次试验编程,对栈及队列加深理解,熟记了一些代码,了解自己不足之处,收获不少。