利用栈队列逆置.docx
- 文档编号:11708195
- 上传时间:2023-03-30
- 格式:DOCX
- 页数:15
- 大小:75.65KB
利用栈队列逆置.docx
《利用栈队列逆置.docx》由会员分享,可在线阅读,更多相关《利用栈队列逆置.docx(15页珍藏版)》请在冰豆网上搜索。
利用栈队列逆置
实验报告
**_专业**班_**年__*月_**日
姓名_***__学号***电话***
一:
实验题目
试利用堆栈将队列中的元素逆置。
该程序的功能是实现顺序栈及队列的定义和操作。
该程序包括定义的栈结构类型、队列结构类型以及对每一种栈、每一种队列操作的具体的函数定义和主函数。
二:
.需求分析
本演示程序用TC编写,完成栈的初始化、栈的判空、入栈、出栈、输出栈中所有元素队列的初始化、队列长、取队头元素、入队、出队、判断队空、输出队中所有元素等功能。
①输入的形式和输入值的范围:
插入元素时需要输入插入的位置和元素的值;删除元素时输入删除元素的位置。
在所有输入中,元素的值都是整数
②输出的形式:
在所有三种操作中都显示操作是否正确以及操作后栈的内容。
其中删除操作后显示删除的元素的值,查找操作后显示要查找元素的位置。
③程序所能达到的功能:
栈的初始化、栈的判空、入栈、出栈、取栈顶元素、输出栈中所有元素、显示菜单、队列的初始化、队列长、取队头元素、入队、出队、判断队空、输出队中所有元素。
④测试数
据:
A:
建立队列为1,2,3,4,5
B:
求出队的长度为5;
C:
取队头5,返回这个元素在栈中的位置
D:
遍历队列1,2,3,4,5
E:
出队,完成入栈。
F:
出栈,完成队列逆置。
5,4,3,2,1
三:
概要设计
1、为了实现上述程序功能,需要定义单链表的抽象数据类型:
typedefstruct//定义队列结构体类型
{
DataType*base;
intfront;
intrear;
}Queue;
/*定义DataType为int类型*/
typedefintDataType;
/*栈的结点类型*/
#defineMAXSIZE1024
typedefstruct
{DataTypedata[MAXSIZE];
inttop;
}SeqStack;
/*初始化顺序栈*/
SeqStackSeqStackInit()
/*检查顺序栈是否为空*/
intSeqStackEmpty(SeqStackS)
/*把S置为空栈*/
voidClearStack(SeqStack*S)
/*把元素x压入栈,使其成为新的栈顶元素*/
voidSeqStackPush(SeqStack*S,DataTypex)
/*把栈顶元素弹出*/
DataTypeSeqStackPop(SeqStack*S)
/*输出顺序栈中的元素*/
voidSeqStackPrint(SeqStackS)
voidInitQ(Queue*Q)//初始化操作
intGetLen(QueueQ)//求队列长操作
intGetfront(QueueQ,DataTypee)//取队头元素操作
intEnqueue(Queue*Q,DataTypex)//入队列操作
intOutqueue(Queue*Q,DataTypee,SqeStack*s)//出队列操作
intEmpty(Queue*Q)//判断空操作
voidList(Queue*Q)//输出操作
2、本程序包含14个函数:
(1)初始化函数:
SqeStackSqeStackInitstack()
(2)判断栈是否为空的函数:
intSqeStackEmpty(SqeStacks)
(3)入栈函数:
voidSqeStackPush(SqeStack*s,intx)
(4)出栈函数:
intSqeStackPop(SqeStacks)
(5)取栈顶:
intSqeStackGetTop(SqeStacks)
(6)输出栈中所有元素:
voidSqeStackPrint(SqeStacks)
(7)主函数:
main()
(8)初始化操作:
voidInitQ(Queue*Q)
(9)求队列长操作:
intGetLen(QueueQ)
(10)取队头元素操作:
intGetfront(QueueQ,DataTypee)
(11)入队列操作:
intEnqueue(Queue*Q,DataTypex)
(12)出队列操作:
intOutqueue(Queue*Q,DataTypee,SqeStack*s)
(13判断空操作:
intEmpty(Queue*Q)
(14)输出操作:
voidList(Queue*Q)
四:
详细设计
实现概要设计中定义的所有的数据类型,对每个操作给出伪码算法。
对主程序和其他模块也都需要写出伪码
由于栈的算法已经给出过,这里不再重复,之给出队列的算法:
算法:
1)、定义结构体
typedefstruct
{
DataType*base;
intfront;
intrear;
}Queue;
2)、初始化
voidInitQ(Queue*Q)//初始化操作
{
Q->base=(DataType*)malloc(maxsize*sizeof(DataType));
Q->front=Q->rear=0;
}
3)、判空
intEmpty(Queue*Q)//判断空操作
{
if(Q->front==Q->rear)
return1;
elsereturn0;
}
4)、求队列长
intGetLen(QueueQ)//求队列长操作
{
return((Q.rear-Q.front+maxsize)%maxsize);
}
5)、取队头元素
intGetfront(QueueQ,DataTypee)//取队头元素操作
{
if(Q.front==Q.rear)
return0;
e=Q.base[Q.front];
return1;
}
6)、入队
intEnqueue(Queue*Q,DataTypex)//入队列操作
{
if((Q->rear+1)%maxsize==Q->front)
return0;
Q->base[Q->rear]=x;
Q->rear=(Q->rear+1)%maxsize;
return1;
}
7)、出队列、入栈
intOutqueue(Queue*Q,DataTypee,SqeStack*s)//出队列操作
{
inti,n,j;
*s=SqeStackInitstack(*s);
if(Q->front==Q->rear)
return0;
printf("出队成功,出队元素是:
");
i=0;
while(Q->front!
=Q->rear)
{e=Q->base[Q->front];
Q->front=(Q->front+1)%maxsize;
SqeStackPush(s,e);
printf("%d",e);
}
return1;
}
8)、输出操作
voidList(Queue*Q)//输出操作
{
inti;
i=Q->front;
while(i!
=Q->rear)
{
printf("%6d",Q->base[i]);
i=(i+1)%maxsize;
}
printf("\n");
}
五:
程序代码
#include"stdio.h"
#include"malloc.h"
#include"windows.h"
#definemaxsize100
typedefintDataType;
typedefstruct{//结构体栈
DataTypedata[maxsize];
inttop;
}SqeStack;
//结构体队
typedefstruct
{
DataType*base;
intfront;
intrear;
}Queue;
SqeStackSqeStackInitstack(SqeStacks)//初始化栈
{
s.top=0;
returns;
}
intSqeStackEmpty(SqeStacks)//判断栈是否为空
{
if(s.top==0)
{printf("这是空栈");
return1;
}
else
{printf("这不是空栈");
return0;
}
}
voidSqeStackPush(SqeStack*s,intx)//入栈
{
s->top++;
s->data[s->top]=x;
}
intSqeStackPop(SqeStacks)//出栈
{
inttemp;
temp=s.data[s.top];
s.top--;
returntemp;
}
voidSqeStackPrint(SqeStacks)
{intp;
p=s.top;
while(p!
=0)
{
printf("%4d",s.data[p]);
p--;
}
}
voidInitQ(Queue*Q)//初始化操作
{
Q->base=(DataType*)malloc(maxsize*sizeof(DataType));
Q->front=Q->rear=0;
}
intGetLen(QueueQ)//求队列长操作
{
return((Q.rear-Q.front+maxsize)%maxsize);
}
intGetfront(QueueQ,DataTypee)//取队头元素操作
{
if(Q.front==Q.rear)
return0;
e=Q.base[Q.front];
return1;
}
intEnqueue(Queue*Q,DataTypex)//入队列操作
{
if((Q->rear+1)%maxsize==Q->front)
return0;
Q->base[Q->rear]=x;
Q->rear=(Q->rear+1)%maxsize;
return1;
}
intOutqueue(Queue*Q,DataTypee,SqeStack*s)//出队列操作
{
inti,n,j;
*s=SqeStackInitstack(*s);
if(Q->front==Q->rear)
return0;
printf("出队成功,出队元素是:
");
i=0;
while(Q->front!
=Q->rear)
{e=Q->base[Q->front];
Q->front=(Q->front+1)%maxsize;
SqeStackPush(s,e);
printf("%d",e);
}
return1;
}
intEmpty(Queue*Q)//判断空操作
{
if(Q->front==Q->rear)
return1;
elsereturn0;
}
voidList(Queue*Q)//输出操作
{
inti;
i=Q->front;
while(i!
=Q->rear)
{
printf("%6d",Q->base[i]);
i=(i+1)%maxsize;
}
printf("\n");
}
voidmain()
{
QueueQ;
SqeStacks;DataTypex;
intt,i,j;inta[maxsize];
intl;
charm;
InitQ(&Q);
do{
printf("\t\t\t\t请你选择要进行的操作:
\n");
printf("1.入队列操作\n");
printf("2.出队列并将出队元素入栈操作\n");
printf("3.求队长\n");
printf("4.遍历队列中所有元素\n");
printf("5.判断是否队空\n");
printf("6.初始化队列\n");
printf("7.输出栈中元素即为队列的逆置\n");
printf("0.退出\n");
scanf("%c",&m);
switch(m)
{
case'1':
printf("输入入队列的元素:
\n");
scanf("%d",&x);
Enqueue(&Q,x);
printf("入队列成功!
\n");
system("pause");
getchar();
system("cls");
break;
case'2':
Outqueue(&Q,x,&s);
system("pause");
getchar();
system("cls");
break;
case'3':
l=GetLen(Q);
printf("队列的长度为:
%d\n\n",l);
system("pause");
getchar();
system("cls");
break;
case'4':
printf("队列中的元素为:
\n");
List(&Q);
system("pause");
getchar();
system("cls");
break;
case'5':
l=Empty(&Q);
if(l==1)printf("队空!
\n");
elseprintf("队不为空!
");
system("pause");
getchar();
system("cls");
break;
case'6':
InitQ(&Q);
printf("初始化队成功");
printf("Theemptyqueueis:
%d\n",Empty(&Q));
//system("pause");
getchar();
system("cls");
break;
case'7':
printf("Theemptystackis:
%d\n",SqeStackEmpty(s));
printf("逆置的队列是:
");
SqeStackPrint(s);
system("pause");
getchar();
system("cls");
break;
case'0':
break;
default:
printf("输入有误,请重新输入!
\n\n\n");
system("pause");
getchar();
system("cls");
break;
}}while(m!
='0');
}
六:
程序测试
1、建立队列。
1,2,3,4,5
运行截图:
2、求队长
运行截图;
3、出队并进栈操作
4、输出逆置的队列
七.心得体会和遇到的问题
这次编程,首先我觉得是对我C语言知识的进一步提高和巩固,在编程中遇到了很多的问题,比如在编写建表的函数时,总是不能按照我输进去的数据生成栈,最后,仔细是检查代码,发现程序中建立链栈的四步中有一部的指针搞颠倒了,害得我忙了好久;还有些问题是向室友求教最后搞定的,比如,在编写菜单时,总不知道参数是怎样传递的问题,自己的程序就不知道怎么去进行了,最后实在是没有办法,问了下米昂同学,然后才恍然大悟。
结果很快就把代码写好了。
其实,程序一定要自己坚持做,遇到问题时不能怕,要敢于面对问题,敢于解决问题,积极的想办法、想注意,实在是自己不能解决的可以求助与他人,但是一定要记住的是绝对不能依靠别人,同学的作用只是去引导你一下。
我想,在以后的编程中我会更加的出色,能够很快的完成作业!
我永远坚信的一句话“长风破浪会有时,直挂云帆济沧海”。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 队列