山东大学数据结构第二次实验实验报告.docx

上传人:b****2 文档编号:2200601 上传时间:2022-10-27 格式:DOCX 页数:17 大小:111.06KB
下载 相关 举报
山东大学数据结构第二次实验实验报告.docx_第1页
第1页 / 共17页
山东大学数据结构第二次实验实验报告.docx_第2页
第2页 / 共17页
山东大学数据结构第二次实验实验报告.docx_第3页
第3页 / 共17页
山东大学数据结构第二次实验实验报告.docx_第4页
第4页 / 共17页
山东大学数据结构第二次实验实验报告.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

山东大学数据结构第二次实验实验报告.docx

《山东大学数据结构第二次实验实验报告.docx》由会员分享,可在线阅读,更多相关《山东大学数据结构第二次实验实验报告.docx(17页珍藏版)》请在冰豆网上搜索。

山东大学数据结构第二次实验实验报告.docx

山东大学数据结构第二次实验实验报告

实验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(n

printf("请重新输入想要入队元素个数(小于%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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1