数据结构 实验二 栈队列算法设计.docx

上传人:b****5 文档编号:8404661 上传时间:2023-01-31 格式:DOCX 页数:15 大小:62.24KB
下载 相关 举报
数据结构 实验二 栈队列算法设计.docx_第1页
第1页 / 共15页
数据结构 实验二 栈队列算法设计.docx_第2页
第2页 / 共15页
数据结构 实验二 栈队列算法设计.docx_第3页
第3页 / 共15页
数据结构 实验二 栈队列算法设计.docx_第4页
第4页 / 共15页
数据结构 实验二 栈队列算法设计.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

数据结构 实验二 栈队列算法设计.docx

《数据结构 实验二 栈队列算法设计.docx》由会员分享,可在线阅读,更多相关《数据结构 实验二 栈队列算法设计.docx(15页珍藏版)》请在冰豆网上搜索。

数据结构 实验二 栈队列算法设计.docx

数据结构实验二栈队列算法设计

中国矿业大学计算机科学与技术系试验报告

课程名称________数据结构_______试验名称____栈、队列算法设计_________________

班级____信息安全08-1_____姓名___________学号___________仪器组号_______实验日期___09-11-18___

实验报告要求:

1.实验目的2.实验内容3.实验步骤4.程序清单

5.运行结果6.流程图7.实验体会

一实验目的

1熟悉栈、队列这种特殊线性结构的特性;

2熟练掌握栈、队列在顺序存储结构和链表存储结构下的基本操作。

二、实验要求:

1实验之前认真准备,编写好源程序。

2实验中认真调试程序,对运行结果进行分析,注意程序的正确性和健壮性的验证。

3不断积累程序的调试方法。

三、实验内容

基本题(必做):

1分别就栈的顺序存储结构和链式存储结构实现栈的各种基本操作。

2假设以带头结点的循环链表表示队列,并且只设一个指针指向对尾结点,不设

头指针,试设计相应的置队空、入队和出队的程序。

加强题:

3设线性表A中有n个字符,试设计程序判断字符串是否中心对称,例如xyzyx和xyzzyx都是中心对称的字符串。

四、程序清单

基本题:

1.#include

#include

#include

constSTACK_INIT_SIZE=100;//存储空间初始分配量

constSTACKINCREMENT=10;//存储空间分配增量

typedefstruct{

int*base;//在构造之前和销毁之后,base的值为NULL

int*top;//栈顶指针

intstacksize;//当前已分配的存储空间,以元素为单位

}SqStack;

voidInitStack(SqStack&S){

//构造一个空栈S

S.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));

if(!

S.base)

exit(0);//存储分配失败

S.top=S.base;

S.stacksize=STACK_INIT_SIZE;

//cout<<"初始化完毕"<

}//InitStack

voidGetTop(SqStackS,int&e){

//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR

if(S.top==S.base)

{cout<<"此栈为空!

!

!

"<

exit(0);

}

e=*(S.top-1);

cout<

//cout<<"取值结束"<

}//GetTop

voidPush(SqStack&S,inte){

//插入元素e为新的栈顶元素

if(S.top-S.base>S.stacksize){//栈满,追加存储空间

S.base=(int*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));

if(!

S.base)

{cout<<"新分配空间失败!

"<

exit(0);

}

S.top=S.base+S.stacksize;

S.stacksize+=STACKINCREMENT;

}

*S.top++=e;

//cout<<"插入元素成功"<

}//Push

voidPop(SqStack&S,int&e){

//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR

if(S.base==S.top)

{cout<<"此栈为空栈,无法删除!

"<

exit(0);

}

e=*--S.top;

//cout<<"删除成功!

"<

}//Pop

voidClearStack(SqStack&S){

//把S置为空栈

if(S.base==S.top)

cout<<"此栈已经为空!

!

!

"<

S.top=S.base;

}//ClearStack

voidmain(){

SqStackStack;

intm,n,x,y,z,i=0;

InitStack(Stack);

cout<<"请输入您要建立的栈的大小:

"<

cin>>n;

Stack.stacksize=n;

do{

cout<<"请选择操作:

"<

cout<<""<<"1,进栈2,出栈3,查看栈顶值4,清空栈5,退出"<

cin>>m;

switch(m){

case1:

cout<<"请输入进栈值:

"<

cin>>z;

if(i==Stack.stacksize)

{

cout<<"Sorry!

!

!

"<

!

"<

!

!

"<

exit(0);

}

Push(Stack,z);

i++;

break;

case2:

Pop(Stack,x);

cout<

break;

case3:

cout<<"栈顶值为:

"<

GetTop(Stack,y);

break;

case4:

ClearStack(Stack);

break;

case5:

cout<<"Exit!

!

"<

break;

default:

cout<<"输入错误!

此程序将退出!

"<

exit(0);

}//switch

}while(m!

=5);

getch();

}

2.#include

#include

#include

#include

//链式栈

typedefstructStack{

Stack*next;

intdata;

}Stack,*SLink;

typedefstruct{

SLinktop;

intlength;

}SqStack;

voidInitStack(SqStack&S){

//构造一个空栈

S.top=NULL;//设栈顶指针的初值为"空"

S.length=0;//空栈中元素个数为

}//InitStack

voidPush(SqStack&S,int&e){

//在栈顶之上插入元素e为新的栈顶元素

SLinkp;

p=newStack;//建新的结点

p->data=e;

p->next=S.top;

S.top=p;

++S.length;

}//Push

voidPop(SqStack&S,int&e){

//若栈不空,则删除S的栈顶元素,用e返回其值

if(!

S.top)

{cout<<"此栈为空栈!

"<

exit(0);

}

e=S.top->data;

S.top=S.top->next;

}//Pop

voidGetTop(SqStack&S,int&e){

//若栈不空,取栈顶元素,用e返回其值

if(!

S.top)

{cout<<"此栈为空栈!

!

!

"<

exit(0);

}

e=S.top->data;

cout<

}//GetTop

voidClearStack(SqStack&S){

//

if(!

S.top)

cout<<"此栈已经为空!

!

!

"<

S.top=NULL;

}//ClearStack

voidmain(){

SqStackStack;

InitStack(Stack);

intm,n,x,y,z,i=0;

cout<<"请输入您要建立的栈的大小:

"<

cin>>n;

//需改正!

!

!

do{

cout<<"请选择操作:

"<

cout<<""<<"1,进栈2,出栈3,查看栈顶值4,清空栈5,退出"<

cin>>m;

switch(m){

case1:

cout<<"请输入进栈值:

"<

cin>>z;

if(i==n)

{

cout<<"Sorry!

!

!

"<

!

"<

!

!

"<

exit(0);

}

Push(Stack,z);

i++;

break;

case2:

Pop(Stack,x);

cout<

break;

case3:

cout<<"栈顶值为:

"<

GetTop(Stack,y);

break;

case4:

ClearStack(Stack);

break;

case5:

cout<<"Exit!

!

"<

break;

default:

cout<<"输入错误!

此程序将退出!

"<

exit(0);

}//switch

}while(m!

=5);

getch();

getch();

}

#include

#include

#include

//队空、入队和出队

intn=0;

typedefstructQ{

intdata;

Q*next;

}Q,*QLink;

voidInitQ(QLink&q){

//构造一个队列

q->next=q;

}//InitQ

voidPush(QLink&q,int&e){

//入队

QLinkp;

p=newQ;

p->data=e;

p->next=q->next;

q->next=p;

n++;

}//Push

voidOutQ(QLink&q,int&e){

//出队

QLinkp;

QLinkt;

p=newQ;

t=newQ;

p=q;

inti;

for(i=0;i<=n;i++){

if(p->next->data==e)

{

t=p->next;

p->next=t->next;

deletet;

break;

}//if

p=p->next;

}//for

if(i==(n+1)){

cout<<"您所输入的值不存在!

此程序将退出!

"<

exit(0);

}

}//OutQ

voidClearQ(QLink&q){

//置队空

q=q->next;

}//ClearQ

voidcheckQ(QLink&q,int&e){

//查看队尾元素

if(q->next==q){

cout<<"此队列为空!

程序将退出!

"<

exit(0);

}

e=q->next->data;

}//check

voidmain(){

intm,x,n,y;

QLinkQu;

Qu=newQ;

InitQ(Qu);

do{

cout<<"请选择操作:

"<

cout<<"1,入队2,出队3,查看队尾元素4,清空队列5,退出"<

cin>>x;

switch(x){

case1:

cout<<"请输入您想插入的值:

"<<"\t";

cin>>m;

Push(Qu,m);

break;

case2:

cout<<"请输入您想出队的值:

"<<"\t";

cin>>n;

OutQ(Qu,n);

cout<

break;

case3:

checkQ(Qu,y);

cout<<"队尾元素为:

"<

break;

}//switch

}while(x!

=5);

getch();

}

加强题:

#include

#include

usingnamespacestd;

boolcomp(charx,chary){

if(x==y)

returntrue;

else

returnfalse;

}//comp

voidmain(){

charstr[100];

cout<<"请输入字符串:

"<

cin>>str;

inti=0,m;

while(str[i]){

i++;

}

m=i%2;

if(m){

intp=i-1,q=0;

intj;

for(j=0;j<(i-1)/2;j++){

if(!

comp(str[q++],str[p--]))

break;

}//for

if(j==(i-1)/2)

cout<<"此字符串对称!

"<

else

cout<<"此字符串不对称!

"<

}//if

else{

intp=i-1,q=0;

intj;

for(j=0;j<(i/2);j++){

if(!

comp(str[q++],str[p--]))

break;

}//for

if(j==i/2)

cout<<"此字符串对称!

"<

else

cout<<"此字符串不对称!

"<

}//else

}

五、运行结果

1.

六、实验体会

栈和队列是数据结构里面很重要的两种特殊线性结构,它们的操作不同于线性表,其运算(插入和删除)是受限制的。

栈的所有插入和删除操作都限制在表的同一端进行,其最先插入的元素被压在栈的底部,要到所有后插入的元素全部被删除后才能删除。

记住了原理,程序就好办了。

教师评价

及格

不及格

教师签名

日期

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

当前位置:首页 > 高等教育 > 工学

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

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