用链表实现栈和队列.docx
《用链表实现栈和队列.docx》由会员分享,可在线阅读,更多相关《用链表实现栈和队列.docx(9页珍藏版)》请在冰豆网上搜索。
用链表实现栈和队列
数据结构与算法分析
实验二
•实验报告
姓名:
XXXXXXXXXX
学号:
XXXXXXXXXX
班级:
CCCCCCCCCC
实验二
(1)用链表实现栈
、实验描述用链表实现一个栈。
二、实验设计
1.进栈(PUSH算法
1若TOP>n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);
2置T0P=T0P+1(栈指针加1,指向进栈地址);
3S(TOP)=X,结束(X为新进栈的元素);
2.退栈(POP算法
1若TOPW0,则给出下溢信息,作出错处理(退栈前先检查是否
已为空栈,空则下溢;不空则作②);
2X=S(TOP),(退栈后的元素赋给X):
3TOP=TOP-1,结束(栈指针减1,指向栈顶)。
三、实验实现代码
#include#include#defineDataTypeint#defineMAXSIZE1024typedefstruct{
DataTypedata[MAXSIZE];inttop;
}SeqStack;
//栈初始化
SeqStack*lnit_SeqStack(){
xxxxxxxxxxx数据结构实验报告•实验
SeqStack*s;
s=(SeqStack*)malloc(sizeof(SeqStack));if(!
s){
printf(”空间不足\n");
returnNULL;
}
else{
s->top=-1;
returns;
}
}
//判栈空
intEmpty_SeqStack(SeqStack*s){if(s->top==-1)return1;
else
return0;
}
//入栈
intPush_SeqStack(SeqStack*s,DataTypex){if(s->top==MAXSIZE-1)return0;//栈满不能入栈
else
{
s->top++;
s->data[s->top]=x;
return1;
}
}
//出栈
intPop_SeqStack(SeqStack*s,DataType*x){if(Empty_SeqStack(s))
return0;//栈空不能出栈
else
{
*x=s->data[s->top];
s->top--;
return1;
}//栈顶元素存入*x,返回
}
//取栈顶元素
DataTypeTop_SeqStack(SeqStack*s){if(Empty_SeqStack(s))
return0;//栈空
else
returns->data[s->top];
}
intPrint_SeqStack(SeqStack*s){
inti;
printf("当前栈中的元素:
\n");
for(i=s->top;i>=0;i--)
printf("%3d",s->data[i]);
printf("\n");
return0;
}
intmain(){
SeqStack*L;
intn,num,m;
inti;
L=lnit_SeqStack();
printf(”初始化完成\n");
printf(”栈空:
%d\n",Empty_SeqStack(L));
printf("请输入入栈元素个数:
\n");
scanf("%d",&n);
printf("请输入要入栈的%d(元素:
\n",n);
for(i=0;iscanf("%d",&num);
Push_SeqStack(L,num);
}
Print_SeqStack(L);
printf("栈顶元素:
%d\n",Top_SeqStack(L));
%d个):
printf("请输入要出栈的元素个数(不能超过
\n",n);
scanf("%d",&n);
printf("依次出栈的%d(元素:
\n",n);
for(i=0;iPop_SeqStack(L,&m);
printf("%3d",m);
}
printf("\n");
Print_SeqStack(L);
printf("栈顶元素:
%d\n",Top_SeqStack(L));return0;
}
四、实验结果
嗣始化宪成
扶空・i
请输人入栈元素个数I
情输入熨入栈的「卜元素:
23
朋
4
酬
42
当前栈屮的元泰
473444523
请输人第出磯的元盍个数(不能趙过5心柱欣出槎知个元茅:
4?
34445
当前栈中肉元素:
23
栈顶元素;财
IVg33sykeyt<*^on^iniuc
实验二
(2)用链表实现队列
一、实验描述
用链表实现一个队列。
二、实验设计
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。
进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列中没有元素时,称为空队列。
在队列这种数据结构中,最先插入的元素将是最先
被删除的元素;反之最后插入的元素将最后被删除的元素,因此
队列又称为“先进先出”(FIFO—firstinfirstout)的线性表。
队列空的条件:
front=rear队列满的条件:
rear=MAXSIZE
三、实验实现代码
#include
#include
typedefstructQNode
{
intdata;
structQNode*next;
}QNode;
typedefstructQList
{
structQNode*front;
structQNode*end;
}QList;
voidInitQL(QList*QL)
{
if(QL==NULL)
QL=(QList*)malloc(sizeof(QList));
QL->front=NULL;
XXXXXXXXXXX数据结构实验报告•实验二CCCCCCCCCCCCCC
QL->end=NULL;
}
voidInsertQL(QList*QL,intvalue)
{
QNode*p;
p=(QNode*)malloc(sizeof(QNode));
p->data=value;
if(QL->front==NULL)
{
QL->front=p;
QL->end=p;
p->next=NULL;
}
else
{
p->next=NULL;
QL->end->next=p;
QL->end=p;
}
}
intDeleteQL(QList*QL)
{
QNode*p;
intres;
if(QL->front==NULL)
{
return-1;
}
res=QL->front->data;
p=QL->front;
if(QL->front->next==NULL)
{
QL->front=NULL;
QL->end=NULL;
}
else
-{
QL->front=p->next;
}
free(p);
CCCCCCCCCCCCCC
xxxxxxxxxxx数据结构实验报告•实验
returnres;
voidPrint(QList*QL)
{
QNode*p;
p=QL->front;
while(p)
{
printf("%d\t",p->data);p=p->next;
}
}intmain()
{
QList*ML;
inti,val;
ML=(QList*)malloc(sizeof(QList));
InitQL(ML);
for(i=0;i<34;i++)
{
InsertQL(ML,i*8+3);
}
Print(ML);
printf("\n");
for(i=1;i<32;i++)
{
val=DeleteQL(ML);printf("%d\t",val);
}
Print(ML);
printf("\n");
return0;
}
四、实验结果