数据结构实验 栈和队列.docx
- 文档编号:10573848
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:14
- 大小:199.19KB
数据结构实验 栈和队列.docx
《数据结构实验 栈和队列.docx》由会员分享,可在线阅读,更多相关《数据结构实验 栈和队列.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构实验栈和队列
实验二第三章栈和队列
一、栈
【实验源码】
#include
#include
#include
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
typedefintSElemType;
typedefintStatus;
typedefstruct{
SElemType*base;
SElemType*top;
intstacksize;
}SqStack;
StatusInitStack(SqStack&S){
//构造一个空栈
inti;
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!
S.base)return(0);//存储分配失败
S.top=S.base;
printf("请输入5个数字为栈的元素赋值,以空格分隔:
");
for(i=0;i<5;i++)
{
scanf("%d",S.top++);
}
S.stacksize=STACK_INIT_SIZE;
return1;
}//InitStack
/*StatusGetTop(SqStackS,SElemType&e){
//若栈不空,则用e返回S的栈顶元素,并返回1;否则返回0
if(S.top==S.base)return0;
e=*(S.top-1);
return1;
}//GetTop*/
StatusPush(SqStack&S,SElemTypee){
//插入元素e为新的栈顶元素
if(S.top-S.base>=S.stacksize){//栈满,追加存储空间
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!
S.base)return(0);//存储分配失败
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return1;
}//Push
StatusPop(SqStack&S,SElemTypee){
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回1;否则返回0
if(S.top==S.base)return1;
e=*--S.top;
returne;
}//Pop
voidDispay(SqStackS){//显示栈内元素
int*p;
p=S.base;
printf("栈内元素为:
");
while(S.base!
=S.top)
printf("%d",*S.base++);
printf("\n\n");
S.base=p;
}
voidmain()
{
intj,k,t;
SqStacksta;
t=1;
printf("*************欢迎使用栈操作程序:
**********\n");
printf("*********1.栈的初始化**********\n");
printf("*********2.插入元素**********\n");
printf("*********3.删除元素**********\n");
printf("*********4.退出操作**********\n");
while(t){
printf("\n请选择需要使用的功能:
");
scanf("%d",&j);
if(j==1||j==2||j==3||j==4){
switch(j){
case1:
InitStack(sta);
Dispay(sta);
break;
case2:
printf("请输入需要插入的栈顶元素:
");
scanf("%d",&k);
Push(sta,k);
Dispay(sta);
break;
case3:
k=Pop(sta,k);
printf("出栈的栈顶元素为:
%d\n",k);
Dispay(sta);
break;
case4:
t=0;
printf("退出操作,谢谢使用!
\n");
Dispay(sta);
break;
}
}
elseprintf("输入错误!
请重新输入!
谢谢!
\n");
}
}
【程序运行截图】
二、动态队列
【实验源码】
#include
#include
#include
typedefintQElemType;
typedefintStatus;
typedefstructQNode{
QElemTypedata;
structQNode*next;
intstacksize;
}QNode,*QueuePtr;
typedefstruct{
QueuePtrfront;//队头指针
QueuePtrrear;//队尾指针
}LinkQueue;
StatusInitQueue(LinkQueue&Q){
//构造一个空队列Q
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!
Q.front)exit(0);//存储分配失败
Q.front->next=NULL;
printf("队列初始化成功\n");
return1;
}
StatusEnQueue(LinkQueue&Q,QElemTypee){
//插入元素e为Q的新的队尾元素
QueuePtrp;
p=(QueuePtr)malloc(sizeof(QNode));
if(!
p)exit(0);//存储分配失败
p->data=e;p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return1;
}
StatusDeQueue(LinkQueue&Q,QElemType&e){
//若队列不空,则删除Q的队头元素,用e返回其值,并返回1;否则返回0
QueuePtrp;
if(Q.front==Q.rear)return0;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)Q.rear=Q.front;
free(p);
returne;
}
voidDisplay(LinkQueueQ){//显示队列元素
QueuePtrp;
p=Q.front;
printf("队列现有的元素为:
");
while(Q.front!
=Q.rear)
{
Q.front=Q.front->next;
printf("%d",*Q.front);
}
printf("\n");
Q.front=p;
}
voidmain()
{
intj,k,t;
LinkQueueQ;
t=1;
printf("**********欢迎使用动态队列操作程序:
********\n");
printf("*********1.队列的初始化**********\n");
printf("*********2.插入元素**********\n");
printf("*********3.删除元素**********\n");
printf("*********4.退出操作**********\n");
while(t){
printf("\n请选择需要使用的功能:
");
scanf("%d",&j);
if(j==1||j==2||j==3||j==4){
switch(j){
case1:
InitQueue(Q);
break;
case2:
printf("请输入需要插入至队列的元素:
");
scanf("%d",&k);
EnQueue(Q,k);
Display(Q);
break;
case3:
k=DeQueue(Q,k);
printf("出队的队列元素为:
%d\n",k);
Display(Q);
break;
case4:
t=0;
Display(Q);
printf("退出操作!
谢谢使用!
\n");
break;
}
}
elseprintf("输入错误!
请重新输入!
谢谢!
\n");
}
}
【程序运行截图】
三、循环队列
【实验源码】
#include
#include
#include
#defineMAXQSIZE4//队列最多可插入3个元素,一个为空
typedefintQElemType;
typedefintStatus;
typedefstruct{
QElemType*base;
intfront;//队头指针
intrear;//队尾指针
}SqQueue;
StatusInitQueue(SqQueue&Q){
//构造一个空队列Q
Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType));
if(!
Q.base)exit(0);//存储分配失败
Q.front=Q.rear=0;
printf("循环队列初始化成功\n");
return1;
}
StatusEnQueue(SqQueue&Q,QElemTypee){
//插入元素e为Q的新的队尾元素
if((Q.rear+1)%MAXQSIZE==Q.front)//队列满
{
printf("循环队列元素已满!
\n");
return0;
}
else
{
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
return1;
}
}
StatusDeQueue(SqQueue&Q,QElemType&e){
//若队列不空,则删除Q的队头元素,用e返回其值,并返回1;否则返回0
if(Q.front==Q.rear)return0;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
returne;
}
voidDisplay(SqQueueQ){//显示队列元素
inti;
i=Q.front;
if(Q.front!
=Q.rear){//若队列不空,显示队列元素
printf("循环队列现有的元素为:
");
while(i!
=Q.rear)
{
printf("%d",Q.base[i]);
i=(i+1)%MAXQSIZE;
}
}
printf("\n");
}
StatusGetHead(SqQueueQ){//若队列Q不空,则用e输出显示Q的队头元素,并返回1;否则返回0;
inte;
if(Q.front==Q.rear){//队列空
printf("队列元素已空!
");return0;}
else{
e=Q.base[Q.front];//将队头元素的值赋值给e
printf("队列现有队头元素为%d",e);return1;}
}
voidmain()
{
intj,k,t;
SqQueueQ;
t=1;
printf("**********欢迎使用循环队列操作程序:
********\n");
printf("*********1.循环队列初始化**********\n");
printf("*********2.插入元素**********\n");
printf("*********3.删除元素**********\n");
printf("*********4.退出操作**********\n");
while(t){
printf("\n请选择需要使用的功能:
");
scanf("%d",&j);
if(j==1||j==2||j==3||j==4){
switch(j){
case1:
InitQueue(Q);
break;
case2:
printf("请输入需要插入至循环队列的元素(此循环队列最多可容纳3个元素):
");
scanf("%d",&k);
EnQueue(Q,k);
GetHead(Q);
Display(Q);
break;
case3:
k=DeQueue(Q,k);
printf("删除的循环队列队头元素为:
%d\n",k);
GetHead(Q);
Display(Q);
break;
case4:
t=0;
GetHead(Q);
Display(Q);
printf("退出操作!
谢谢使用!
\n");
break;
}
}
elseprintf("输入错误!
请重新输入!
谢谢!
\n");
}
}
【程序运行截图】
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构实验 栈和队列 数据结构 实验 队列
![提示](https://static.bdocx.com/images/bang_tan.gif)