栈和队列的简单操作.docx
- 文档编号:3945683
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:20
- 大小:162.06KB
栈和队列的简单操作.docx
《栈和队列的简单操作.docx》由会员分享,可在线阅读,更多相关《栈和队列的简单操作.docx(20页珍藏版)》请在冰豆网上搜索。
栈和队列的简单操作
实验2栈与队列
成绩
专业班级信息131班学号**********20姓名郝腾宇报告日期2015.11.18
实验类型:
●验证性实验○综合性实验○设计性实验
实验目的或任务
通过指导学生上机实践,对常用数据结构的基本概念及其不同的实现方法的理论得到进一步的掌握,并对在不同存储结构上实现不同的运算方式和技巧有所体会。
实验教学基本要求
1.了解实验目的及实验原理;
2.编写程序,并附上程序代码和结果图;
3.总结在编程过程中遇到的问题、解决办法和收获。
实验教学的内容或要求
1.编写函数,采用链式存储实现栈的初始化、入栈、出栈操作
2.编写函数,采用顺序存储实现栈的初始化、入栈、出栈操作
3.编写函数,采用链式存储实现队列的初始化、入队、出队操作
4.编写函数,采用顺序存储实现队列的初始化、入队、出队操作
5.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法
实验开出要求
必做
实验所需仪器设备
1.计算机
2.相关软件(如C,C++,PASCAL,VC,DELPHI等等)
实验所用材料
计算机耗材
一、
实验效果图
1、顺序栈的进栈操作
2、顺序栈的出栈操作
3、链栈的进栈操作
4、链栈的出栈操作
5、链队列的入队操作
6、链队列的出队操作
7、顺序队列的入队操作
8、顺序队列的出队操作
二、实验总结
通过这次实验,让我在程序的基础上更深的了解到了栈和队列的两种特殊单链表的区别,以及顺序栈和链栈,顺序队列和链队列在计算机中不同的存储方式。
两种不同的存储方式有不同的优缺点。
在第一次的单链表的基础上,这次实验报告有了很大的提高,但是在初始化的时候还是将“0”做为结束标志,使得栈和队列依然不能存储数字“0”。
而且在程序的书写有些地方不够简洁,例如case语句太过复杂,也有些函数占用的空间太大。
在接下来的实验中我会更加努力,更加认真,合理的设计程序的结构,让程序的通用性更高。
三、
程序代码
#define_CRT_SECURE_NO_WARNINGS
#include
#include
typedefintstackelementtype,queueelementtype;
#definestack_size50//设置栈中的元素个数为50
#definequeue_size50//设置队列中的元素个数为50
typedefstruct//定义顺序栈的结构体
{
stackelementtypeelem[stack_size];//存放栈元素的一维数组
inttop;//用来存放栈顶元素的下标,top=-1表示空栈
}seqstack;
typedefstructnode//定义链栈的结构体
{
stackelementtypedata;
structnode*next;
}linkstacknode;
typedeflinkstacknode*linkstack;
typedefstructnode1//定义链队列的结构体
{
queueelementtypedata;
structnode1*next;
}linkqueuenode;
typedefstruct
{
linkqueuenode*front;
linkqueuenode*rear;
}linkqueue;
typedefstruct//定义顺序队列的结构体
{
queueelementtypeelem[queue_size];//存放队列元素的一维数组
inttop;//用来存放队列元素的下标,top=-1表示空队
}seqqueue;
//顺序栈函数声明
seqstack*seqpush(seqstack*s,stackelementtypex);//顺序进栈函数
seqstack*seqpop(seqstack*s);//顺序出栈函数
voidseqget(seqstack*s);//读取栈中的元素
//链栈函数声明
linkstacklinkpush(linkstacktop,stackelementtypex);//链栈的进栈函数
linkstacklinkpop(linkstacktop);//链栈的出栈函数
voidlinkget(linkstacktop);//读取链栈中的元素
//链队列的函数声明
linkqueue*linkenterqueue(linkqueue*q,queueelementtypex);//链队列的入队操作
linkqueue*linkdeletequeue(linkqueue*q);//链队列的出队操作
voidlinkgetqueue(linkqueue*q);//读取链队列中的元素
//顺序队列的函数声明
seqqueue*seqenterqueue(seqqueue*s,queueelementtypex);//顺序入队函数
seqqueue*seqdeletequeue(seqqueue*s);//顺序出队函数
voidseqgetqueue(seqqueue*s);//读取顺序队中的元素
intmain()
{
intinput;
do
{
printf("\t\t\t栈和队列的简单操作\n\n");
printf("\t1顺序栈的进栈操作\n");
printf("\t2顺序栈的出栈操作\n");
printf("\t3链栈的进栈操作\n");
printf("\t4链栈的出栈操作\n");
printf("\t5链队列的入队操作\n");
printf("\t6链队列的出队操作\n");
printf("\t7顺序队列的入队操作\n");
printf("\t8顺序队列的出队操作\n");
printf("\t0退出\n");
printf("请选择:
");
scanf("%d",&input);
switch(input)
{
case1:
{
seqstack*head;
stackelementtypex;
printf("请输入栈中的元素,最多存储50个:
");
head=(seqstack*)malloc(sizeof(seqstack));
head->top=-1;
scanf("%d",&x);
while(x!
=0)
{
head=seqpush(head,x);
scanf("%d",&x);
}
printf("入栈之后的结果为:
");
seqget(head);
printf("\n");
break;
}
case2:
{
seqstack*head;
stackelementtypex;
printf("请输入栈中的元素,最多存储50个:
");
head=(seqstack*)malloc(sizeof(seqstack));
head->top=-1;
scanf("%d",&x);
while(x!
=0)
{
head=seqpush(head,x);
scanf("%d",&x);
}
printf("原栈为:
");
seqget(head);
printf("\n");
do
{
if(head->top!
=0)
{
head=seqpop(head);
printf("出栈之后的结果为:
");
seqget(head);
printf("\n继续出栈请输入1,停止出栈请输入0:
");
scanf("%d",&x);
}
else
{
printf("顺序栈为空,不能继续出栈!
\n");
break;
}
}
while(x==1);
break;
}
case3:
{
linkstackhead;
stackelementtypex=1;
head=(linkstacknode*)malloc(sizeof(linkstacknode));
head->next=NULL;
printf("请开始入栈,最多存储50个:
");
while(x!
=0)
{
scanf("%d",&x);
if(x!
=0)
{
head=linkpush(head,x);
}
}
printf("入栈之后的结果为:
");
linkget(head);
printf("\n");
break;
}
case4:
{
linkstackhead;
stackelementtypex=1;
head=(linkstacknode*)malloc(sizeof(linkstacknode));
head->next=NULL;
printf("请输入栈中的元素,最多存储50个:
");
while(x!
=0)
{
scanf("%d",&x);
if(x!
=0)
{
head=linkpush(head,x);
}
}
printf("初始化之后的栈为:
");
linkget(head);
printf("\n");
do
{
if(head->next!
=NULL)
{
head=linkpop(head);
printf("出栈之后的结果为:
");
linkget(head);
printf("\n继续出栈请输入1,停止出栈请输入0:
");
scanf("%d",&x);
}
else
{
printf("链栈为空,不能继续出栈!
\n");
break;
}
}while(x==1);
break;
}
case5:
{
linkqueue*head;
queueelementtypex;
head=(linkqueue*)malloc(sizeof(linkqueue));
head->front=(linkqueuenode*)malloc(sizeof(linkqueuenode));
head->rear=head->front;
head->front->next=NULL;
x=1;
printf("请输入需要入队的元素:
");
while(x!
=0)
{
scanf("%d",&x);
if(x!
=0)
{
head=linkenterqueue(head,x);
}
}
printf("入队的结果为:
");
linkgetqueue(head);
printf("\n");
break;
}
case6:
{
linkqueue*head;
queueelementtypex;
head=(linkqueue*)malloc(sizeof(linkqueue));
head->front=(linkqueuenode*)malloc(sizeof(linkqueuenode));
head->rear=head->front;
head->front->next=NULL;
x=1;
printf("请输入需要入队的元素:
");
while(x!
=0)
{
scanf("%d",&x);
if(x!
=0)
{
head=linkenterqueue(head,x);
}
}
printf("入队的结果为:
");
linkgetqueue(head);
printf("\n");
do
{
if(head->front!
=head->rear)
{
head=linkdeletequeue(head);
printf("出队之后的结果为:
");
linkgetqueue(head);
printf("\n继续出队请输入1,停止出队请输入0:
");
scanf("%d",&x);
}
else
{
printf("队列为空不能继续出队!
\n");
break;
}
}while(x==1);
break;
}
case7:
{
seqqueue*head;
queueelementtypex;
printf("请输入队中的元素,最多存储50个:
");
head=(seqqueue*)malloc(sizeof(seqqueue));
head->top=-1;
scanf("%d",&x);
while(x!
=0)
{
head=seqenterqueue(head,x);
scanf("%d",&x);
}
printf("入队之后的结果为:
");
seqgetqueue(head);
printf("\n");
break;
}
case8:
{
seqqueue*head;
queueelementtypex;
printf("请输入队中的元素,最多存储50个:
");
head=(seqqueue*)malloc(sizeof(seqqueue));
head->top=-1;
scanf("%d",&x);
while(x!
=0)
{
head=seqenterqueue(head,x);
scanf("%d",&x);
}
printf("原队为:
");
seqgetqueue(head);
printf("\n");
do
{
if(head->top!
=-1)
{
head=seqdeletequeue(head);
printf("出队之后的结果为:
");
seqgetqueue(head);
printf("\n继续出队请输入1,停止出栈请输入0:
");
scanf("%d",&x);
}
else
{
printf("顺序队为空,不能继续出队!
\n");
break;
}
}while(x==1);
break;
}
default:
{
break;
}
}
}
while(input!
=0);
system("pause");
return0;
}
seqstack*seqpush(seqstack*s,stackelementtypex)//顺序进栈函数
{
if(s->top==stack_size-1)
return0;
s->top++;
s->elem[s->top]=x;
returns;
}
seqstack*seqpop(seqstack*s)//顺序出栈函数
{
if(s->top==-1)
return0;
else
{
s->top=s->top-2;//读取栈中元素结束循环的时候s->top比未读取之前大了1
returns;
}
}
voidseqget(seqstack*s)//读取栈中的元素
{
intsize;
size=s->top;
s->top=0;
while(s->top<=size)
{
printf("%d",s->elem[s->top]);
s->top++;
}
}
linkstacklinkpush(linkstacktop,stackelementtypex)//链栈的进栈函数
{
linkstacknode*temp;
temp=(linkstacknode*)malloc(sizeof(linkstacknode));
if(temp==NULL)
return0;
temp->data=x;
temp->next=top->next;
top->next=temp;
returntop;
}
linkstacklinkpop(linkstacktop)//链栈的出栈函数
{
linkstacknode*temp;
temp=top->next;
if(temp==NULL)
return0;
top->next=temp->next;
free(temp);
returntop;
}
voidlinkget(linkstacktop)//读取链栈中的元素
{
while(top->next!
=NULL)
{
printf("%d",top->next->data);
top=top->next;
}
}
linkqueue*linkenterqueue(linkqueue*q,queueelementtypex)//链队列的入队操作
{
linkqueuenode*newnode;
newnode=(linkqueuenode*)malloc(sizeof(linkqueuenode));
if(newnode!
=NULL)
{
newnode->data=x;
newnode->next=NULL;
q->rear->next=newnode;
q->rear=newnode;
returnq;
}
else
return0;
}
linkqueue*linkdeletequeue(linkqueue*q)//链队列的出队操作
{
linkqueuenode*p;
if(q->front==q->rear)
return0;
p=q->front->next;
q->front->next=p->next;
if(q->rear==p)
q->rear=q->front;
free(p);
returnq;
}
voidlinkgetqueue(linkqueue*q)//读取链队列中的元素
{
linkqueuenode*tmp;
tmp=q->front;//保留头指针
while(q->front->next!
=NULL)
{
printf("%d",q->front->next->data);
q->front=q->front->next;
}
q->front=tmp;
}
seqqueue*seqenterqueue(seqqueue*s,queueelementtypex)//顺序入队函数
{
if(s->top==queue_size-1)
return0;
s->top++;
s->elem[s->top]=x;
returns;
}
seqqueue*seqdeletequeue(seqqueue*s)//顺序出队函数
{
if(s->top==-1)
return0;
else
{
for(inti=0;i
{
s->elem[i]=s->elem[i+1];
}
s->top--;
}
returns;
}
voidseqgetqueue(seqqueue*s)//读取顺序队中的元素
{
for(inti=0;i<=s->top;i++)
{
printf("%d",s->elem[i]);
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 队列 简单 操作