栈和队列基本操作实验报告Word格式.docx
《栈和队列基本操作实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《栈和队列基本操作实验报告Word格式.docx(7页珍藏版)》请在冰豆网上搜索。
进栈操作
先创建一个以x为值的新结点p,其data域值为x则进栈操作步骤如下:
将新结点p的指针域指向原栈顶S(执行语句p->
next=S)。
将栈顶S指向新结点p(执行语句S=p)。
注:
进栈操作的①与②语句执行顺序不能颠倒,否则原S指针其后的链表将丢失。
出栈操作
先将结点栈顶S数据域中的值赋给指针变量*x,则删除操作步骤如下:
结点p指针域指向原栈顶S(执行语句p=S)。
栈顶S指向其的下一个结点(执行语句S=S->
next)
释放p结点空间(执行语句free(p))。
队列分析:
用链式存储结构实现的队列称为链队列,一个链队列需要一个队头指针和一个队尾指针才能唯一确定。
队列中元素的结构和前面单链表中的结点的结构一样。
为了操作方便,在队头元素前附加一个头结点,队头指针就指向头结点。
【思考问题】
1.栈的顺序存储和链表存储的差异?
答:
栈的顺序存储有‘后进先出’的特点,最后进栈的元素必须最先出来,进出栈是有序的,在对编某些需要按顺序操作的程序有很大的作用。
链表存储:
通过链表的存储可以实现链表中任意位置的插入元素,删除任意元素,可以实现无序进出。
2.还会有数据移动吗?
为什么?
答:
栈的顺序存储不会有数据移动,移动的只是指向该数据地址的指针。
3.栈的主要特点是什么?
队列呢?
答:
栈拥有‘后进先出’的特点;
队列拥有‘先进先出’的特点。
4.栈的主要功能是什么?
栈作为数据结构,其主要的用途是保存一批数据的逆序信息,从而产生逆序数据。
队列也是一种数据结构,其主要的用途按顺序保存一批数据,并且有序的队数据进行处理。
5.为什么会有环状队列?
为了解决“假溢出”的问题,把顺序结构的头尾进行相连,造出了一个所谓的“环状队列”。
【实验小结】(总结本次实验的重难点及心得、体会、收获)
本次实验主要是对堆栈和队列的顺序存储和链表存储的数据进队、出队等运算中一部分程序进行完善,程序的复杂度也是逐步增加,这让我们对栈和队列的认识也逐步加深。
在做本次实验中,自己亲自动手后,我栈和队列的知识又有了更深层次的了解,掌握了栈“后进先出”和队列“先进先出”的特点,学会了栈和队列的一些基本应用实例,实验的目的就是学会用栈和队列这两种数据结构进行编程,进行一些实际问题的处理,经过本次实验,我对学习也有了一些新的感悟,学了的知识要时常复习,经常巩固,不懂的知识要及时向老师或者同学请教,争取把这门课程学的更好!
【附录-实验代码】
#include<
stdio.h>
stdlib.h>
conio.h>
typedefintelemtype;
typedefstructnode//队列结点类型定义
{elemtypedata;
//队列的数据元素类型
structnode*next;
//指向后继结点的指针
}NODE;
typedefstruct
{//定义链队
NODE*front,*rear;
//定义链队队头和队尾指针
}LINKQUEUE;
voidinitqueue(LINKQUEUE*QL)//队列的初始化
{
QL->
front=(NODE*)malloc(sizeof(NODE));
//队列为带头结点的链队列
front->
next=NULL;
rear=QL->
front;
}
LINKQUEUE*pushqueue(LINKQUEUE*QL,elemtypex)
{//将元素x插入到链队列QL中,作为QL的新队尾
rear->
next=(NODE*)malloc(sizeof(NODE));
next->
data=x;
next;
returnQL;
elemtypepopqueue(LINKQUEUE*QL)
{//若链队列不为空,则删除队头元素,返回其元素值
NODE*newnode;
newnode=QL->
if(newnode==NULL)
return0;
front=QL->
free(newnode);
return(QL->
data);
voidprintqueue(LINKQUEUE*QL)//队列的显示
NODE*p;
p=QL->
if(p==NULL)
printf("
队列空!
"
);
while(p!
=NULL)
{
if(p->
next==NULL)
%d"
p->
else
printf("
%d<
--"
p=p->
}
\n"
voidmain()
LINKQUEUE*p;
intchoice,elemdata,x=0;
p=(LINKQUEUE*)malloc(sizeof(LINKQUEUE));
initqueue(p);
while
(1)
欢迎使用队列操作小程序:
\t1、元素入队\n"
\t2、元素出队\n"
\t3、显示队列\n"
\t4、清屏幕\n"
\t5、退出程序\n"
请选择你的操作:
scanf("
&
choice);
switch(choice)
{
case1:
printf("
请输入进队元素:
scanf("
elemdata);
p=pushqueue(p,elemdata);
printf("
队列中的元素为:
printqueue(p);
system("
pause"
break;
case2:
x=popqueue(p);
if(x!
=0)
元素%d出队!
x);
break;
case3:
队列中的元素分别为:
printqueue(p);
case4:
system("
cls"
case5:
return;
}
system("