栈和队列的基本操作实现及其应用.docx

上传人:b****5 文档编号:6073947 上传时间:2023-01-03 格式:DOCX 页数:18 大小:17.93KB
下载 相关 举报
栈和队列的基本操作实现及其应用.docx_第1页
第1页 / 共18页
栈和队列的基本操作实现及其应用.docx_第2页
第2页 / 共18页
栈和队列的基本操作实现及其应用.docx_第3页
第3页 / 共18页
栈和队列的基本操作实现及其应用.docx_第4页
第4页 / 共18页
栈和队列的基本操作实现及其应用.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

栈和队列的基本操作实现及其应用.docx

《栈和队列的基本操作实现及其应用.docx》由会员分享,可在线阅读,更多相关《栈和队列的基本操作实现及其应用.docx(18页珍藏版)》请在冰豆网上搜索。

栈和队列的基本操作实现及其应用.docx

栈和队列的基本操作实现及其应用

实验二栈和队列的基本操作实现及其应用

一_一、实验目的

1、熟练掌握栈和队列的基本操作在两种存储结构上的实现。

一_二、实验内容

题目一、试写一个算法,判断依次读入的一个以@为结束符的字符序列,是否为回文。

所谓“回文“是指正向读和反向读都一样的一字符串,如“321123”或“ableelba”。

相关常量及结构定义:

#defineSTACK_INIT_SIZE100

#defineSTACKINCREMENT10

typedefintSElemType;

typedefstructSqStack

{SElemType*base;

SElemType*top;

intstacksize;

}SqStack;

设计相关函数声明:

判断函数:

intIsReverse()

栈:

intInitStack(SqStack&S)

intPush(SqStack&S,SElemTypee)

intPop(SqStack&S,SElemType&e)

intStackEmpty(s)

一_三、数据结构与核心算法的设计描述

1、初始化栈

/*函数功能:

对栈进行初始化。

参数:

栈(SqStackS)。

成功初始化返回0,否则返回-1*/

intInitStack(SqStack&S)

{

=(SElemType*)malloc(10*sizeof(SElemType));

if(!

//判断有无申请到空间

return-1;//没有申请到内存,参数失败返回-1

=;

=STACK_INIT_SIZE;

=newSElemType;

return0;

}

2、判断栈是否是空

/*函数功能:

判断栈是否为空。

参数;栈(SqStackS)。

栈为空时返回-1,不为空返回0*/

intStackEmpty(SqStackS)

{

if==return-1;

elsereturn0;

}

3、入栈

/*函数功能:

向栈中插入元素。

参数;栈(SqStackS),元素(SElemtypee)。

成功插入返回0,否则返回-1*/

intPush(SqStack&S,SElemTypee)

{

if{

=(SElemType*)realloc,+1)*sizeof(SElemType));

//重新分配空间

if(!

return-1;

=+;

+=STACKINCREMENT;

}

*++=e;//插入操作

return0;

}

4、出栈

/*函数功能:

在栈中删除元素。

参数;栈(SqStackS),元素(SElemtypee)。

成功删除返回0,否则返回-1*/

intPop(SqStack&S,SElemType&e)

{

if==return-1;

e=*;//删除操作

return0;

}

5、判断是否为回文

/*函数功能:

判断栈中的字符串是否为回文。

参数;栈(SqStackS)。

是回文时返回1,否则返回0*/

intIsReverse(SqStack&S)

{

inti;

chara;

for(i=0;i

{

Pop(S,a);

if(a!

=b[i])return0;

}

return1;

}

一_四、函数的调用

主函数主要设计:

intlpp;

charch;

SqStackp;

InitStack(p);

cout<<"请输入字符:

";

while((ch=())&&ch!

='@')

{

Push(p,ch);

b[j]=ch;

j++;

}

if(StackEmpty(p)==-1)

{

cout<<"此为空栈"<

return0;

}

lpp=IsReverse(p);

if(lpp==0)cout<<"此字符串不是回文。

"<

elsecout<<"此字符串是回文。

"<

一_五、实验总结

通过这次试验我熟悉了对栈的基本操作,对基本的栈操作有了很好的掌握,知道自己容易在什么地方出错,。

一_六、程序清单

#include

usingnamespacestd;

#defineSTACK_INIT_SIZE100

#defineSTACKINCREMENT10

charb[STACK_INIT_SIZE+STACKINCREMENT];

intj=0;

typedefcharSElemType;

typedefstructSqStack

{SElemType*base;

SElemType*top;

intstacksize;

}SqStack;

intInitStack(SqStack&S)

{

=(SElemType*)malloc(10*sizeof(SElemType));

if(!

return-1;

=;

=STACK_INIT_SIZE;

=newSElemType;

return0;

}

intStackEmpty(SqStackS)

{

if==return-1;

elsereturn0;

}

intPush(SqStack&S,SElemTypee)

{

if{

=(SElemType*)realloc,+1)*sizeof(SElemType));

if(!

return-1;

=+;

+=STACKINCREMENT;

}

*++=e;

return0;

}

intPop(SqStack&S,SElemType&e)

{

if==return-1;

e=*;

return0;

}

intIsReverse(SqStack&S)

{

inti;

chara;

for(i=0;i

{

Pop(S,a);

if(a!

=b[i])return0;

}

return1;

}

intmain()

{

intlpp;

charch;

SqStackp;

InitStack(p);

cout<<"请输入字符:

";

while((ch=())&&ch!

='@')

{

Push(p,ch);

b[j]=ch;

j++;

}

if(StackEmpty(p)==-1)

{

cout<<"此为空栈"<

return0;

}

lpp=IsReverse(p);

if(lpp==0)cout<<"此字符串不是回文。

"<

elsecout<<"此字符串是回文。

"<

return0;

}

二_一、实验目的

2、会用栈和队列解决简单的实际问题。

二_二、实验内容

题目二、编程模拟队列的管理,主要包括:

出队列、入队、统计队列的长度、查找队列某个元素e、及输出队列中元素。

相关常量及结构定义:

typedefintQElemType;

typedefstructQNode

{

QElemTypedata;

structQNode*next;

}QNode,*QueuePtr;

typedefstruct

{

QueuePtrfront;

QueuePtrrear;

intcount;

}LinkQueue;

设计相关函数声明:

InitQueue(LinkQueue&Q)

EnQueue(LinkQueue&Q,QElemTypee)

DeQueue(LinkQueue&Q,QElemType&e)

QueueLength(LinkQueueQ)

QueueTraverse(LinkQueueQ)

QueueFind(LinkQueueQ,QElemTypee)

二_三、数据结构与核心算法的设计描述

1、初始化队列

intInitQueue(LinkQueue&Q)

{

==(QueuePtr)malloc(sizeof(QNode));

if(!

return-1;

>next=NULL;

return0;

}

2、入队列

intEnQueue(LinkQueue&Q,QElemTypee)

{

QueuePtrlpp;

lpp=(QueuePtr)malloc(sizeof(QNode));

if(!

lpp)return-1;

lpp->data=e;lpp->next=NULL;

if==NULL)

{

>next=lpp;

=lpp;

}

else

{

>next=lpp;

=lpp;

}

return0;

}

3、出队列

intDeQueue(LinkQueue&Q,QElemType&e)

{

QueuePtrlpp;

if==return-1;

lpp=>next;

e=lpp->data;

>next=lpp->next;

if==lpp)=;

deletelpp;

return0;

}

4、统计队列的长度

intQueueLength(LinkQueueQ)

{

QueuePtrlpp=;

inti=0;

while(lpp!

=

{

i++;

lpp=lpp->next;

}

returni;

}

5、查找队列的某个元素

intQueueFind(LinkQueueQ,QElemTypee)

{

QueuePtrp;

p=>next;

while(p)

{

if(p->data==e)

return1;

p=p->next;

}

return0;

}

6、遍历队列

intQueueTraverse(LinkQueueQ)

{

QueuePtrp;

p=>next;

while(p)

{

cout<data<<'\t';

p=p->next;

}

cout<

return0;

}

7、主界面函数

voidzhujiemian()

{

cout<

cout<<"【\t\t数据结构实验二】"<

cout<<"【\t\t---------------------------------------------------------------------】"<

cout<<"【\t\t1队列初始化】"<

cout<<"【\t\t2出队列】"<

cout<<"【\t\t3入队列】"<

cout<<"【\t\t4队列长度】"<

cout<<"【\t\t5在队列中查找元素】"<

cout<<"【\t\t6遍历队列】"<

cout<<"【\t\t其他键退出】"<

cout<<"【\t\t---------------------------------------------------------------------】"<

cout<<"【\t\t请选择要进行操作的序号(1--6)】:

";

}

二_四、函数调用及主函数设计

主函数主要涉及:

LinkQueueQ;

inta,b,c;

zhujiemian();

cin>>a;

while(a!

=1)

{

cout<<"输入错误,必须先初始化,请重新输入:

";

cin>>a;

}

cout<

do

{

switch(a)

{

case1:

if(InitQueue(Q)==0)

cout<<"初始化成功!

"<

else

cout<<"初始化失败!

"<

break;

case2:

if(QueueLength(Q)==0)

{

cout<<"队列为空无法出队!

"<

break;

}

if(DeQueue(Q,c)==0)

cout<<"删除成功!

"<

else

cout<<"删除失败!

"<

break;

case3:

cout<<"输入你要入队元素"<

cin>>c;

if(EnQueue(Q,c)==0)

cout<<"入队成功!

"<

else

cout<<"入队失败!

"<

break;

case4:

b=QueueLength(Q);

cout<<"队列的长度为:

"<

break;

case5:

cout<<"您要查找的元素:

";

cin>>b;

if(QueueFind(Q,b)==1)

cout<<"恭喜您,队列中有您要找的元素"<

else

cout<<"不好意思,队列中没有您要找的元素"<

break;

case6:

QueueTraverse(Q);

break;

default:

break;

}

zhujiemian();

cin>>a;

cout<

}while(a>0&&a<=6);

说明:

通过调用序列号不同的函数进行各种操作。

函数根据每次输入的数进行判断不在1—6内的函数将结束,否则将继续进行。

二_五、程序调试及运行结果分析

程序第一步必须执行初始化,否则程序不能运行。

在程序第一步必须执行初始化后,程序完美运行,在进行任何函数操作程序都是正常运行,而且本程序对插入和删除时进行错误检测如有的地方不可以插入,有点地方不能删除,如果队列为空时则程序会输出队列为空,并继续进行其他操作,大大减少了程序的bug。

二_六、程序清单

#include

usingnamespacestd;

typedefintQElemType;

typedefstructQNode

{

QElemTypedata;

structQNode*next;

}QNode,*QueuePtr;

typedefstruct

{

QueuePtrfront;

QueuePtrrear;

intcount;

}LinkQueue;

intInitQueue(LinkQueue&Q)

{

==(QueuePtr)malloc(sizeof(QNode));

if(!

return-1;

>next=NULL;

return0;

}

intEnQueue(LinkQueue&Q,QElemTypee)

{

QueuePtrlpp;

lpp=(QueuePtr)malloc(sizeof(QNode));

if(!

lpp)return-1;

lpp->data=e;lpp->next=NULL;

if==NULL)

{

>next=lpp;

=lpp;

}

else

{

>next=lpp;

=lpp;

}

return0;

}

intDeQueue(LinkQueue&Q,QElemType&e)

{

QueuePtrlpp;

if==return-1;

lpp=>next;

e=lpp->data;

>next=lpp->next;

if==lpp)=;

deletelpp;

return0;

}

intQueueLength(LinkQueueQ)

{

QueuePtrlpp=;

inti=0;

while(lpp!

=

{

i++;

lpp=lpp->next;

}

returni;

}

intQueueTraverse(LinkQueueQ)

{

QueuePtrp;

p=>next;

while(p)

{

cout<data<<'\t';

p=p->next;

}

cout<

return0;

}

intQueueFind(LinkQueueQ,QElemTypee)

{

QueuePtrp;

p=>next;

while(p)

{

if(p->data==e)

return1;

p=p->next;

}

return0;

}

voidzhujiemian()

{

cout<

cout<<"【\t\t数据结构实验二】"<

cout<<"【\t\t---------------------------------------------------------------------】"<

cout<<"【\t\t1队列初始化】"<

cout<<"【\t\t2出队列】"<

cout<<"【\t\t3入队列】"<

cout<<"【\t\t4队列长度】"<

cout<<"【\t\t5在队列中查找元素】"<

cout<<"【\t\t6遍历队列】"<

cout<<"【\t\t其他键退出】"<

cout<<"【\t\t---------------------------------------------------------------------】"<

cout<<"【\t\t请选择要进行操作的序号(1--6)】:

";

}

intmain()

{

LinkQueueQ;

inta,b,c;

zhujiemian();

cin>>a;

while(a!

=1)

{

cout<<"输入错误,必须先初始化,请重新输入:

";

cin>>a;

}

cout<

do

{

switch(a)

{

case1:

if(InitQueue(Q)==0)

cout<<"初始化成功!

"<

else

cout<<"初始化失败!

"<

break;

case2:

if(QueueLength(Q)==0)

{

cout<<"队列为空无法出队!

"<

break;

}

if(DeQueue(Q,c)==0)

cout<<"删除成功!

"<

else

cout<<"删除失败!

"<

break;

case3:

cout<<"输入你要入队元素"<

cin>>c;

if(EnQueue(Q,c)==0)

cout<<"入队成功!

"<

else

cout<<"入队失败!

"<

break;

case4:

b=QueueLength(Q);

cout<<"队列的长度为:

"<

break;

case5:

cout<<"您要查找的元素:

";

cin>>b;

if(QueueFind(Q,b)==1)

cout<<"恭喜您,队列中有您要找的元素"<

else

cout<<"不好意思,队列中没有您要找的元素"<

break;

case6:

QueueTraverse(Q);

break;

default:

break;

}

zhujiemian();

cin>>a;

cout<

}while(a>0&&a<=6);

return0;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1