《数据结构 c语言版》实验二 栈和队列Word文件下载.docx
- 文档编号:17474860
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:13
- 大小:18.91KB
《数据结构 c语言版》实验二 栈和队列Word文件下载.docx
《《数据结构 c语言版》实验二 栈和队列Word文件下载.docx》由会员分享,可在线阅读,更多相关《《数据结构 c语言版》实验二 栈和队列Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
}SqStack;
/*初始化顺序栈函数*/
voidInitStack(SqStack*p)
{q=(SqStack*)malloc(sizeof(SqStack)/*申请空间*/)
/*入栈函数*/
voidPush(SqStack*p,ElemTypex)
{if(p->
top<
MAXNUM-1)
{p->
top=p->
top+1;
/*栈顶+1*/
p->
stack[p->
top]=x;
}
/*数据入栈*/
}
/*出栈函数*/
ElemTypePop(SqStack*p)
{x=p->
top];
/*将栈顶元素赋给x*/
top-1;
}/*栈顶-1*/
/*获取栈顶元素函数*/
ElemTypeGetTop(SqStack*p)
{x=p->
/*遍历顺序栈函数*/
voidOutStack(SqStack*p)
{for(i=p->
top;
i>
=0;
i--)
printf("
第%d个数据元素是:
%6d\n"
i,p->
stack[i]);
/*置空顺序栈函数*/
voidsetEmpty(SqStack*p)
{p->
top=-1;
2./*定义链队列*/
typedefstructQnode
{
ElemTypedata;
structQnode*next;
}Qnodetype;
typedefstruct
Qnodetype*front;
Qnodetype*rear;
}Lqueue;
/*初始化并建立链队列函数*/
voidcreat(Lqueue*q)
h=(Qnodetype*)malloc(sizeof(Qnodetype));
/*初始化申请空间*/
h->
next=NULL;
q->
front=h;
rear=h;
for(i=1;
i<
=n;
i++)*利用循环快速输入数据*/
{
scanf("
%d"
&
x);
Lappend(q,x);
}
/*利用入链队列函数快速输入数据*/
/*入链队列函数*/
voidLappend(Lqueue*q,intx)
{s->
data=x;
s->
rear->
next=s;
rear=s;
/*出链队列函数*/
ElemTypeLdelete(Lqueue*q)
{p=q->
front->
next;
next=p->
if(p->
next==NULL)
rear=q->
front;
x=p->
data;
free(p);
}/*释放空间*/
/*遍历链队列函数*/
voiddisplay(Lqueue*q)
{while(p!
=NULL)
/*利用条件判断是否到队尾*/
printf("
%d-->
"
p->
data);
p=p->
}
五、思考题
1.读栈顶元素的算法与退栈顶元素的算法有何区别?
2.如果一个程序中要用到两个栈,为了不发生上溢错误,就必须给每个栈预先分配一个足够大的存储空间。
若每个栈都预分配过大的存储空间,势必会造成系统空间紧张。
如何解决这个问题?
(1)链栈只有一个top指针,对于链队列,为什么要设计一个头指针和一个尾指针?
(2)一个程序中如果要用到两个栈时,可通过两个栈共享一维数组来实现。
即双向栈共享邻接空间。
如果一个程序中要用到两个队列,能否实现?
如何实现?
六、实验报告要求
1.程序要添加适当的注释,程序的书写要采用缩进格式。
2.程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应,如插入删除时指定的位置不对等等。
3.程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。
七、参考代码
1.栈的顺序表示和实现
#include<
stdio.h>
stdlib.h>
conio.h>
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
typedefintStatus;
typedefintSElemType;
//-----栈的顺序存储表示-----
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
SElemType*base;
SElemType*top;
intstacksize;
}SqStack;
StatusInitStack(SqStack&
S);
StatusDestroyStack(SqStack&
StatusStackDisplay(SqStack&
StatusGetTop(SqStackS,SElemType&
e);
StatusPush(SqStack&
S,SElemTypee);
StatusPop(SqStack&
S,SElemType&
StatusStackEmpty(SqStackS);
S){//构造一个空栈S
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!
S.base)exit(OVERFLOW);
//存储分配失效
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
returnOK;
}//InitStack
S){//销毁栈S
if(S.base)free(S.base);
S.top=S.base=NULL;
S){//显示栈S
SElemType*p=S.base;
inti=0;
if(S.base==S.top){
堆栈已空!
\n"
);
while(p<
S.top)
printf("
[%d:
%d]"
++i,*p++);
}//StackDisplay
e){
//若栈不空,则用e返回S的栈顶元素,
//并返回OK;
否则返回ERROR
if(S.top==S.base)returnERROR;
e=*(S.top-1);
}//GetTop
S,SElemTypee){//插入元素e为新的栈顶元素
if(S.top-S.base>
=S.stacksize){//栈满,追加存储空间
S.base=(SElemType*)realloc(S.base,
(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!
S.base)exit(OVERFLOW);
//存储分配失败
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
*S.top++=e;
}//Push
//若栈不为空,则删除S的栈顶元素,
//用e返回其值,并返回OK;
if(S.top==S.base)returnERROR;
e=*--S.top;
}//Pop
StatusStackEmpty(SqStackS){
//若S为空栈,则返回TRUE,否则返回FALSE。
if(S.top==S.base)returnTRUE;
elsereturnFALSE;
}//StackEmpty
voidmain(){
SqStackSt;
Statustemp;
intflag=1,ch;
inte;
本程序实现顺序结构的堆栈的操作。
可以进行入栈,出栈,取栈顶元素等操作。
InitStack(St);
//初始化堆栈St
while(flag){
请选择:
1.显示栈中所有元素\n"
2.入栈\n"
3.出栈\n"
4.取栈顶元素\n"
5.退出程序\n"
scanf("
ch);
switch(ch){
case1:
StackDisplay(St);
break;
case2:
printf("
请输入要入栈的元素(一个整数):
scanf("
//输入要入栈的元素
temp=Push(St,e);
//入栈
if(temp!
=OK)printf("
堆栈已满!
入栈失败!
else{
printf("
成功入栈!
//成功入栈
StackDisplay(St);
}
case3:
temp=Pop(St,e);
//出栈
if(temp==ERROR)printf("
成功出栈一个元素:
%d\n"
e);
//成功出栈
case4:
temp=GetTop(St,e);
//取得栈顶元素
elseprintf("
栈顶元素是:
//显示栈顶元素
default:
flag=0;
程序结束,按任意键退出!
getch();
}
DestroyStack(St);
2.队列的链式表示和实现
//Status是函数的类型,其值是函数结果状态代码
//ElemType是顺序表数据元素类型,此程序定义为int型
typedefintQElemType;
//-----单链队列--队列的链式存储结构-----
typedefstructQNode{//定义结点结构
QElemTypedata;
//数据域
structQNode*next;
//指针域
}QNode,*QueuePtr;
typedefstructlinkqueue{//定义队列结构
QueuePtrfront;
//队头指针
QueuePtrrear;
//队尾指针
}LinkQueue;
StatusInitLinkQueue(LinkQueue&
//初始化一个队列
StatusDestroyLinkQueue(LinkQueue&
//销毁一个队列
intLinkQueueLength(LinkQueue&
Q);
//队列的长度
StatusEnLinkQueue(LinkQueue&
QElemType);
//将一个元素入队列
StatusDeLinkQueue(LinkQueue&
QElemType&
//将一个元素出队列
StatusDisplayLinkQueue(LinkQueue);
//显示队列中所有元素
LinkQueueLQ;
QElemTypee;
intflag=1,ch,len;
本程序实现链式结构队列的操作。
可以进行入队列、出队列等操作。
InitLinkQueue(LQ);
//初始化队列
1.显示队列所有元素\n"
2.入队列\n"
3.出队列\n"
4.求队列的长度\n"
5.退出程序\n"
DisplayLinkQueue(LQ);
请输入要人队的元素(一个整数):
//输入要入队列的字符
EnLinkQueue(LQ,e);
//入队列
DisplayLinkQueue(LQ);
temp=DeLinkQueue(LQ,e);
//出队列
if(temp==OK){
出队一个元素:
DisplayLinkQueue(LQ);
队列为空!
len=LinkQueueLength(LQ);
队列的长度为:
len);
flag=0;
程序运行结束,按任意键退出!
Q){//队列初始化
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
//生成一个头结点,并把首尾指针指向头结点
Q.front->
Q){//销毁一个队列
QueuePtrp;
while(Q.front!
=Q.rear)
DeLinkQueue(Q,e);
free(Q.front);
Q.front=Q.rear=NULL;
Q){//队列的长度
inti=0;
QueuePtrp=Q.front;
while(p!
=Q.rear){
++i;
p=p->
returni;
Q,QElemTypee){//入队列
p=(QueuePtr)malloc(sizeof(QNode));
//生成一个新结点
p->
data=e;
//赋值
Q.rear->
next=p;
//插入至队列尾
Q.rear=p;
//修改队尾指针
Q,QElemType&
e){//出队列
if(Q.front==Q.rear)returnERROR;
//判断队列是否已空,已空返回ERROR
p=Q.front->
//p指向队列中第一个元素
e=p->
//取得该元素值
//修改队首指针
if(Q.rear==p)Q.rear=Q.front;
//若队列已空,把队尾指针指向头结点
//成功出队列,返回OK
StatusDisplayLinkQueue(LinkQueueQ){//显示队列中所有元素
if(p==NULL)printf("
//队列为空
else{
while(p){//否则显示队列中所有元素
++i,p->
p=p->
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 c语言版 数据结构 c语言版实验二 栈和队列 数据结构 语言版 实验 队列
![提示](https://static.bdocx.com/images/bang_tan.gif)