山东大学数据结构第二次实验实验报告.docx
《山东大学数据结构第二次实验实验报告.docx》由会员分享,可在线阅读,更多相关《山东大学数据结构第二次实验实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
![山东大学数据结构第二次实验实验报告.docx](https://file1.bdocx.com/fileroot1/2022-10/27/f52b9c7e-1a37-46a9-bba4-7da38bc0e29c/f52b9c7e-1a37-46a9-bba4-7da38bc0e29c1.gif)
山东大学数据结构第二次实验实验报告
实验2ADT栈与队列的编程与实现
实验目的:
加深对抽象数据类型ADT栈和队列的理解;
实验原理:
参照课本p.64-66,及Figure3.39-3.44;
课本p.82-83,及Figure3.57-3.60.
实验内容:
编写程序实现ADT栈的定义,及常用操作(数组或指针实现):
1)生成栈;
2)Push
3)Pop
编写程序实现ADT队列的定义,及常用操作:
1)生成队列;
2)Enqueues入列;
3)Isempty判断是否队列为空。
实验要求:
1)实现ADT栈的结构及操作;
2)实现ADT队列的结构及操作,并给出应用。
1.栈(链表实现)
实验源程序:
#include"stdafx.h"
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
#include"string.h"
typedefstructnode//定义一个栈的结构
{
intdata;
structnode*pNext;//pNext为指向栈中下一个空间的指针
}Node,*pNode;
typedefpNodeStack;
StackInitStack();//初始化栈
voidCreateStack(StackTop);//生成栈
boolEmpty(StackTop);//判断栈是否为空
voidPush(StackTop,intn);//进行压栈操作
voidPop(StackTop);//进行出栈操作
voidTraverseStack(StackTop);//遍历栈的函数
voidDeleteStack(StackTop);//清空栈的函数
intmain()//主函数
{
intn;
charstr[6];//定义数组,存储操作指令
StackTop=NULL;//初始化Top为NULL
Top=InitStack();//初始化栈
CreateStack(Top);//生成栈
TraverseStack(Top);//遍历栈
printf("请输入下一步操作指令(push,poporend):
");
while
(1)
{
scanf("%s",str);//获取操作指令
if(strcmp(str,"push")==0)
{
printf("请输入入栈的元素:
");
scanf("%d",&n);
Push(Top,n);//进栈操作
TraverseStack(Top);
printf("请输入下一步操作指令(push,poporend):
");
}
if(strcmp(str,"pop")==0)
{
Pop(Top);//出栈操作
TraverseStack(Top);
printf("请输入下一步操作指令(push,poporend):
");
}
if(strcmp(str,"end")==0)
break;//跳出循环
if(strcmp(str,"push")!
=0&&strcmp(str,"pop")!
=0&&strcmp(str,"end")!
=0)
{
printf("输入指令错误,请重新输入指令:
");
}
}
DeleteStack(Top);//释放栈空间
return0;
}
StackInitStack()//进行栈的初始化的函数
{
StackTop=(Stack)malloc(sizeof(Node));//分配内存空间给栈顶
if(Top==NULL)
{
printf("动态分配内存失败\n");
exit
(1);
}
printf("初始化栈成功\n");
Top->pNext=NULL;//栈顶指针的指向置为NULL;
returnTop;
}
voidCreateStack(StackTop)//生成栈
{
intLEN,x;
StackBottom=Top;//令Top和Bottom指向同一空间
Bottom->pNext=NULL;
printf("请输入想要入栈的元素个数:
");
scanf("%d",&LEN);
for(inti=0;i{
printf("请输入第%d个元素(从栈顶到栈底):
",i+1);
scanf("%d",&x);
StackpNew=(Stack)malloc(sizeof(Node));
pNew->data=x;//将输入的数放在栈data单元中
Bottom->pNext=pNew;//Bottom指向新分配空间的单元
pNew->pNext=NULL;//令pNew指向NULL
Bottom=pNew;//让新分配空间的单元成为栈底
}
printf("生成栈成功\n");
}
boolIsEmpty(StackTop)//判断栈是否为空
{
returnTop->pNext==NULL;
}
voidPush(StackTop,intn)//进行进栈操作的函数
{
StackpNew=(Stack)malloc(sizeof(Node));//定义一个新节点,并分配内存空间
if(pNew==NULL)
{
printf("未能动态分配内存,进栈失败\n");
return;
}
pNew->data=n;
pNew->pNext=Top->pNext;
Top->pNext=pNew;
}
voidPop(StackTop)//进行出栈操作函数
{
Stackp=Top->pNext;
if(IsEmpty(Top)==true)//判断栈是否为空,为空就不能进行出栈操作
{
printf("栈为空,Pop失败\n");
return;
}
else
{
printf("弹出的栈顶元素为:
");
printf("%d\n",p->data);//显示出栈元素
Top->pNext=p->pNext;
free(p);
}
}
voidTraverseStack(StackTop)//遍历栈,获取栈中的数值
{
printf("现在栈中的元素从栈顶到栈底依次为:
");
Stackp=Top->pNext;
if(p==NULL)printf("栈空");
while(p!
=NULL)
{
printf("%d",p->data);
p=p->pNext;
}
printf("\n");
}
voidDeleteStack(StackTop)//释放栈空间
{
Stackp,q;
p=Top->pNext;
while(p!
=NULL)
{
q=p->pNext;
free(p);
p=q;
}
Top->pNext=NULL;
}
实验结果:
1)生成栈
①初始化栈。
②生成栈成功。
2)Push
输入push,进行入栈操作,得到新的栈序列。
3)Pop
①输入pop,进行出栈操作,弹出栈顶元素9,并且得到新的栈序列。
②如果不断进行pop操作,当栈为空时会出现pop失败。
4)其余操作
①结束进程
输入指令end可以结束进程,不会出现要求输入下一步指令。
②输入错误的指令
若在指令输出端输入错误指令,则要求重新输入指令直到输入正确指令
2.队列(循环数组实现)
实验源程序:
#include"stdafx.h"
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
#include"string.h"
#definemaxsize11
typedefstructpQueue
{
intqueue[maxsize];
intrear;//最后元素的位置
intfront;//最前元素的位置的前一个位置
}Aqueue,*Queue;
QueueQueueInit();//初始化队列
voidCreateQueue(QueueQ,intn);//生成队列
intIsFull(QueueQ);//判断队列是否为满
intIsEmpty(QueueQ);//判断队列是否为空
intEnQueue(QueueQ,intx);//入队
intDeQueue(QueueQ);//出队
voidTraverseQueue(QueueQ);//遍历队列
intmain()//主函数
{
intn,x;
charstr[10];
QueueQ=QueueInit();//初始化队列
printf("请输入想要入队元素个数(小于%d):
",maxsize);
while
(1)
{
scanf("%d",&n);
if(nprintf("请重新输入想要入队元素个数(小于%d):
",maxsize);
}
CreateQueue(Q,n);//生成队列
printf("队列中的元素依次为:
");
TraverseQueue(Q);
printf("请输入下一步操作指令(Enqueue,Dequeueorend):
");
while
(1)
{
scanf("%s",str);//获取操作指令
if(strcmp(str,"Enqueue")==0)
{
printf("请输入想要入队的元素:
");
scanf("%d",&x);
if(EnQueue(Q,x))//入队
{
printf("元素%d入队后队列中元素依次为:
",x);
TraverseQueue(Q);
}
printf("请输入下一步操作指令(Enqueue,Dequeueorend):
");
}
if(strcmp(str,"Dequeue")==0)
{
if(IsEmpty(Q)==0)
{
printf("元素%d出队后队列中元素依次为:
",DeQueue(Q));//出队
TraverseQueue(Q);
printf("请输入下一步操作指令(Enqueue,Dequeueorend):
");
}
else
{
printf("队列为空,出队失败\n");
printf("请输入下一步操作指令(Enqueue,Dequeueorend):
");
}
}
if(strcmp(str,"end")==0)
break;//跳出循环
if(strcmp(str,"Enqueue")!
=0&&st