栈与队列的顺序表示和实现实验报告.docx
《栈与队列的顺序表示和实现实验报告.docx》由会员分享,可在线阅读,更多相关《栈与队列的顺序表示和实现实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
![栈与队列的顺序表示和实现实验报告.docx](https://file1.bdocx.com/fileroot1/2023-2/4/0e08520c-f586-432c-975e-91cd043d04b5/0e08520c-f586-432c-975e-91cd043d04b51.gif)
栈与队列的顺序表示和实现实验报告
实验项目
栈与队列的顺序表示和实现实验报告
实验内容
编写一个程序实现顺序栈和顺序队列的各种基本运算,并完成以下操作:
1、初始化顺序队列;
2、建立顺序队列;
3、入队;
4、出队;
5、判断队列是否为空;
6、取队头元素;
7、遍历队列;
8、初始化顺序栈;
9、插入元素;
10、删除栈顶元素;
11、取栈顶元素;
12、遍历顺序栈;
13、置空顺序栈;
算法设计与程序实现:
算法分析
1、对于顺序栈和顺序队列,都是采用一组地址连续的存储单元一次存放自栈底到栈顶或从队列头到队列尾的数据元素。
2、对于栈,设栈顶指针为top,栈底指针为base。
用top=0或top=base表示栈空。
对于队列,设指针front为队列头指针,设指针rear表示队列尾指针。
用front=rear=0表示空队列。
3、初始化栈和队列时,令top=0或front=rear=0,将栈或队列置空。
4、每入栈一个数据元素,指针top增加1,出栈时,指针top减小1。
每当插入新的队尾数据元素时,指针rear增加1,每当删除一个队头数据元素时,指针front减小1。
核心程序
//顺序队列
#include
#include
#include
#defineMAXNUM100
#defineElemTypeint
#defineTRUE1
#defineFALSE0
//定义队列的顺序存储结构
typedefstruct
{
ElemTypequeue[MAXNUM];
intfront;
intrear;
}sqqueue;
//初始化顺序队列
intinitQueue(sqqueue*q)
{
if(!
q)returnFALSE;
q->front=-1;
q->rear=-1;
returnTRUE;
}
//入队
intappend(sqqueue*q,ElemTypex)
{if(q->rear>=MAXNUM-1)returnFALSE
{q->rear++;
q->queue[q->rear]=x;
returnTRUE;
}
//出队
ElemTypeDelete(sqqueue*q)
{ElemTypex;
if(q->front==q->rear)
{printf("队列空!
\n");return0;}
x=q->queue[++q->front];
printf("队头元素%d出队!
\n",x);
returnx;
}
//判断队列是否为空
intEmpty(sqqueue*q)
{if(q->front==q->rear)returnTRUE;
returnFALSE;}
//获取队头元素
intgethead(sqqueue*q)
{ElemTypex;
if(q->front==q->rear)
{printf("队列空!
\n");return0;}
x=q->queue[q->front+1];printf("\n队头元素:
%d出队\n",x);
returnx;
}
//遍历队
voiddisplay(sqqueue*q)
{ints;
s=q->front;
if(q->front==q->rear)
printf("队列为空!
\n");
else
{printf("\n顺序队列依次为:
");
while(srear)
{s=s+1;
printf("%d<-",q->queue[s]);
}
printf("\n");
printf("顺序队列队尾元素所在位置为:
rear=%d\n,q->rear);
printf("书序队列队头元素所在位置为:
front=%d\n,q->front);
}}
//建立顺序队列
voidSetsqqueue(sqqueue*q)
{intn,i,m;
printf("\n请输入顺序队列的长度:
");
scanf("%d",&n);
printf("\n请依次输入顺序队列的元素值:
\n");
for(i=0;i{scanf("%d",&m);
append(q,m);}
}
//主函数
voidmain()
{sqqueue*head;
intx,select;
head=(squeue*)malloc(sizeof(squeue));
printf("\n第一次使用必须初始化!
\n");
do{
printf("\n********主菜单**********\n");
printf("\n1初始化队列\n");
printf("\n2建立顺序队列\n");
printf("\n3入队\n");
printf("\n4出队\n");
printf("\n5判断队列是否为空\n");
printf("\n6取队头元素\n");
printf("\n7遍历队列\n");
printf("\n0退出程序\n");
printf("\n************************\n");
printf("\n请选择操作:
\n");
scanf("%d",&select);
switch(select)
{case1:
{initQueue(head);
printf("已经初始化队列!
\n");
break;}
case2:
{Setsqqueue(head)
printf("\n已经建立队列!
\n");
dispaly(head);
break;}
case3:
{printf("请输入队的值:
\n");
scanf("%d",&x);
append(head,x);
dispaly(head);
break;}
case4:
{Delete(head);
diapaly(head);
break;}
case5:
{if(Empty(head))
printf("队列空!
\n");
else
printf("队列非空!
\n");
break;}
case6:
{gethead(head);
break;}
case7:
{dispaly(head);
break;}
case0:
exit(0);
}
}while(select<=7);
}
//顺序栈
#include
#include
#defineMAXNUM100
#defineElemTypeint
//定义栈的顺序存储结构
typedefstruct
{
ElemTypestack[MAXNUM];
inttop;
}SqStack;
//初始化顺序栈
voidInitStack(SqStack*p)
{
if(!
p)
printf("内存分配失败!
");
p->top=-1;
}
//入栈
voidPush(SqStack*p,ElemTypex)
{if(p->top{p->top=p->top+1;
p->stack[p->top]=x;
}
else
printf("Overflow!
\n");
}
//出栈
ElemTypePop(SqStack*p)
{ElemTypex;
if(p->top>=0)
{x=p->stack[p->top];
printf("栈顶数据元素%d已经被删除!
\n",p->stack[p->top]);
p->top=p->top-1;
return(x);
}
else
{printf("Underflow!
\n");
return(0);
}}
//获取栈顶元素
ElemTypeGetTop(SqStack*p)
{ElemTypex;
if(p->top>=0)
{x=p->stack[p->top];printf("\n栈顶元素为:
%d\n",x);
return(x);
}
else
{printf("Underflow!
\n");
return(0);
}}
//遍历顺序栈
voidOutStack(SqStack*p)
{inti;
printf("\n");
if(p->top<0)
printf("这是一个空栈!
\n");
for(i=p->top;i>=0;i--);
printf("第%d个数据元素为:
%6d\n",i,p->stack[i]);
}
//置空顺序栈
voidsetEmpty(SqStack*p)
{p->top=-1;}
//主函数
voidmain()
{SqStack*q;
intcord;ElemTypea;
printf("第一次使用必须初始化!
\n");
do{
printf("\n********主菜单**********\n");
printf("\n1初始化顺序栈\n");
printf("\n2插入一个元素\n");
printf("\n3删除栈顶元素\n");
printf("\n4区栈顶元素\n");
printf("\n5置空顺序栈\n");
printf("\n6结束程序运行\n");
printf("\n************************\n");
printf("你选择的序号是(1,2,3,4,5,6)");
scanf("%d",&cord);
switch(cord)
{case1:
{q=(SqStack*)malloc(sizeof(SqStack));
InitStack(q);
OutStack(q);
}break;
case2:
{printf("请输入要插入的元素:
a=");
scanf("%d",&a);
Push(q,a);
OutStack(q);
}break;
case3:
{Pop(q);
OutStack(q);
}break;
case4:
{GetTop(q);
OutStack(q);
}break;
case5:
{setEmpty(q);
printf("\n顺序栈被置空!
\n");
OutStack(q);
}break;
case6:
exit(0);
}
}while(cord<=6);
}
运行结果
1、初始化书序栈
2、
3、入栈及出栈
4、出栈及取栈顶元素
5、
6、初始化队列并输入顺序队列
7、插入新的队尾元素,即入队
8、删除队头数据元素,即出队
9、判断队列是否为空。
10、取队列头元素。
11、遍历顺序队列。
实验总结
此次实验,初步学会了建立顺序栈与顺序队列,并学会了栈和队列的基本算法,再次巩固了指针的用法。
巩固了在课本上学的知识,加深了对栈和队列的认识与掌握。
不过,在编程时,发觉自己在定义结构体和变量时,还有很多不足。
而且,在编写程序时,自己有点粗心大意,经常忘记加“;”和“{}”等。
路漫漫其修远兮,还得上下而求索啊!
!