栈的共享 数据结构.docx

上传人:b****6 文档编号:16467162 上传时间:2023-07-13 格式:DOCX 页数:16 大小:22.77KB
下载 相关 举报
栈的共享 数据结构.docx_第1页
第1页 / 共16页
栈的共享 数据结构.docx_第2页
第2页 / 共16页
栈的共享 数据结构.docx_第3页
第3页 / 共16页
栈的共享 数据结构.docx_第4页
第4页 / 共16页
栈的共享 数据结构.docx_第5页
第5页 / 共16页
栈的共享 数据结构.docx_第6页
第6页 / 共16页
栈的共享 数据结构.docx_第7页
第7页 / 共16页
栈的共享 数据结构.docx_第8页
第8页 / 共16页
栈的共享 数据结构.docx_第9页
第9页 / 共16页
栈的共享 数据结构.docx_第10页
第10页 / 共16页
栈的共享 数据结构.docx_第11页
第11页 / 共16页
栈的共享 数据结构.docx_第12页
第12页 / 共16页
栈的共享 数据结构.docx_第13页
第13页 / 共16页
栈的共享 数据结构.docx_第14页
第14页 / 共16页
栈的共享 数据结构.docx_第15页
第15页 / 共16页
栈的共享 数据结构.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

栈的共享 数据结构.docx

《栈的共享 数据结构.docx》由会员分享,可在线阅读,更多相关《栈的共享 数据结构.docx(16页珍藏版)》请在冰点文库上搜索。

栈的共享 数据结构.docx

栈的共享数据结构

实验二共享栈

一、设计的目的要求

1、了解栈的特性,以及它在实际问题中的应用。

2、掌握栈的实现方法以及它的基本操作,学习运用栈来解决问题。

二、设计的主要内容

设计两个顺序栈共享空间,试写出两个栈公用的栈操作算法push(x,k)和pop(k),其中k为0或1,用以指示栈号。

编写一个完整的程序实现。

三、设计的解题思路

线性表(a1,a2,……,an)试一种逻辑结构,若在计算机中对它采用顺序栈存储结构来存储,则就是栈表。

两个栈表公用一个内存空间图示如下:

0maxsize

Top[0]top[1]

在数据结构中用C语言来描述,可以利用数组表示顺序表。

将两个原表A和B存放在一个数组的存储空间(a1,a2,……,amaxsize-1)中,实现方法是:

设置两个栈顶指针变量top[1]和top[0],开始时top[0]=-1和top[1]=maxsize表示两个栈均为空,然后根据变量k是0还是1,分别进行入栈和出栈的操作。

具体实现还要编写一个完整的程序,用主函数调用这里的函数来完成出入栈的操作。

四、算法思路

#include

#include

#include

#include

#definemaxsize10

typedefintdatatype;

typedefstruct

{

datatypedata[maxsize];

inttop[2];

}sqstack;//定义一个结构体类型的sqstack

sqstacka,*s;//定义一个结构体类型变量a和指针变量ss

 

sqstack*init(sqstack*s)//初始化两个栈均为空,s是指向栈类型的指针

{

s=(sqstack*)malloc(sizeof(sqstack));//申请空间

s->top[0]=-1;//top[1]、top[0]分别是第0和第1个栈的栈顶指针

s->top[1]=maxsize;

returns;

}

 

intpush(sqstack*s,datatypex,intk)//入栈操作,s是栈顶指针,x是要插入的数,k是栈号

{

if(s->top[0]+1==s->top[1])

{

printf("\n");

printf("两个栈均满,不能进栈!

\n");//判断是否栈满

return0;

}

if(k==0)

s->top[k]++;//改栈顶指针加1或减1,来选择不满的栈

else

s->top[k]--;

s->data[s->top[k]]=x;//将X插入当前栈顶

return1;

}

 

intpop(sqstack*s,intk)//出栈操作,栈顶元素由参数x返回

{

intx;

if((k==0&&s->top[0]==-1)||(k==1&&s->top[1]==maxsize))

{

printf("栈空,不能退栈!

\n\n");

return0;

}

x=s->data[s->top[k]];//区栈顶元素给X

if(k==0)

s->top[k]--;//改栈顶指针加1或减1,来选择不满的栈

else

s->top[k]++;

returnx;

}

 

voidget(sqstack*s,intl)//元素输入函数,l来判断是否已经建栈

{

intk=0,x;

while(k==1||k==0)

{

if(l==0)

{

printf("栈还未建立!

\n");

break;

}

else

{

printf("请选择输入方向,正向(0),方向

(1),结束

(2):

");//选择要输入的栈号,并输入元素

scanf("%d",&k);

printf("\n");

if(k==0|k==1)

{

x=0;

printf("请输入数据:

");

while(x!

=-1)

{

scanf("%d",&x);

if(x==-1)

break;

push(s,x,k);

}

printf("\n");

}

else

break;

}

}

}

voidcheck(sqstack*s)//检测栈内的元素但并不输出

{

inti,l=0;

while(l==0||l==1)

{

printf("请选择输出方向,正向(0),方向

(1),结束

(2):

");

scanf("%d",&l);

printf("\n");

if(l==2)

break;

elseif((l==0&&s->top[0]==-1)||(l==1&&s->top[1]==maxsize))

{

printf("栈空,不能退栈!

\n\n");

continue;

}

elseif(l==0)

{

printf("正向数据为:

");

for(i=0;i<=s->top[l];i++)

printf("%4d",s->data[i]);

printf("\n\n");

}

else

{

printf("反向数据为:

");

for(i=maxsize-1;i>=s->top[l];i--)

printf("%4d",s->data[i]);

printf("\n\n");

}

}

}

voidprint(sqstack*s)//元素输出函数

{

intx,z=1,f=1,l=0;

while(l==0||l==1)

{

printf("请选择输出方向,正向(0),方向

(1):

");

scanf("%d",&l);

printf("\n");

x=pop(s,l);

if(x==0)

{

printf("选择'1'继续,'0'结束输出:

");

scanf("%d",&l);

printf("\n");

if(l==1)

continue;

else

break;

printf("\n");

}

elseif(l==0)

{

printf("正向第%d个:

%d\n",z,x);

z++;

printf("\n");

}

else

{

printf("反向第%d个:

%d\n",f,x);

f++;

printf("\n");

}

}

}

voidmenu()//菜单函数

{

printf("栈的共享实验\n");

printf("==================================\n");

printf("1.栈的建立\n");

printf("2.栈的共享输入\n");

printf("3.栈单个的输出\n");

printf("4.栈的检测\n");

printf("0.退出实验\n");

printf("==================================\n");

}

voidmain()//主函数

{

inth,k,l=0;//定义’l’为标志,判断是否已建栈,如未建立l=0,否则l=1

chari;

sqstack*s;

for(;;)

{

menu();

printf("请选择0--4:

");

scanf("%d",&h);

if(h<0||h>4)

{

printf("\n输人错误!

\n");

printf("Enter'y'tocontunie:

");

scanf("%s",&i);

system("cls");

continue;

}

else

switch(h)

{

case1:

system("cls");

printf("**********************************************\n");

printf("*栈的建立*\n");

printf("**********************************************\n");

printf("\n");

s=init(s);//栈的建立

printf("Enter'y'tocontunie:

");

scanf("%s",&i);

printf("\n");

l=1;

system("cls");

break;

case2:

system("cls");

printf("*******************************************\n");

printf("*栈的共享输入*\n");

printf("******************************************\n");

get(s,l);//栈的输入

printf("\n");

printf("Enter'y'tocontunie:

");

scanf("%s",&i);

printf("\n");

system("cls");

break;

case3:

system("cls");

printf("**********************************************\n");

printf("*栈单个的输出*\n");

printf("***********************************************\n");

print(s);//栈的单个输出

printf("\n");

system("cls");

break;

case4:

system("cls");

printf("**********************************************\n");

printf("*栈的检测*\n");

printf("***********************************************\n");

check(s);//对栈内元素的检测

printf("\n");

system("cls");

break;

case0:

system("cls");

printf("*再见!

*\n");

printf("\n");

return0;

}

}

}

五、运算结果

结果一:

0号栈输入元素(1,2,3,4,7,8,10),1号栈输入元素(0,5,6)

栈的共享实验

1.栈的建立

2.栈的共享输入

3.栈单个的输出

4.栈的检测

1.退出实验

请选择0--4:

1(回车)

*栈的建立*

Enter‘y’tocontinue:

y(回车)

*栈的共享输入*

请选择输入方向,正向(0),方向

(1),结束

(2):

0(回车)

请输入数据:

12347810–1(回车)

请选择输入方向,正向(0),方向

(1),结束

(2):

1(回车)

请输入数据:

056–1(回车)

请选择输入方向,正向(0),方向

(1),结束

(2):

2(回车)

Enter‘y’tocontinue:

y(回车)

*栈的检测*

请选择输入方向,正向(0),方向

(1),结束

(2):

0(回车)

正向数据为:

12347810

请选择输入方向,正向(0),方向

(1),结束

(2):

1(回车)

反向数据为:

056

请选择输入方向,正向(0),方向

(1),结束

(2):

2(回车)

 

*栈的单个输出*

请选择输出方向,正向(0),方向

(1):

0(回车)

正向第1个:

10

请选择输出方向,正向(0),方向

(1):

0(回车)

正向第2个:

8

请选择输出方向,正向(0),方向

(1):

0(回车)

正向第3个:

17

请选择输出方向,正向(0),方向

(1):

0(回车)

正向第4个:

4

请选择输出方向,正向(0),方向

(1):

0(回车)

正向第5个:

3

请选择输出方向,正向(0),方向

(1):

0(回车)

正向第6个:

2

请选择输出方向,正向(0),方向

(1):

0(回车)

正向第7个:

1

请选择输出方向,正向(0),方向

(1):

0(回车)

栈空,不能退栈!

选择'1'继续,'0'结束输出:

1(回车)

请选择输出方向,正向(0),方向

(1):

1(回车)

反向第1个:

6

请选择输出方向,正向(0),方向

(1):

1(回车)

反向第2个:

5

请选择输出方向,正向(0),方向

(1):

1(回车)

反向第3个:

0

请选择输出方向,正向(0),方向

(1):

1(回车)

栈空,不能退栈!

选择'1'继续,'0'结束输出:

0(回车)

栈的共享实验

5.栈的建立

6.栈的共享输入

7.栈单个的输出

8.栈的检测

2.退出实验

请选择0--4:

0(回车)

*再见*

按任意键继续……

 

结果二:

还未建立栈就输入数据

栈的共享实验

1.栈的建立

2.栈的共享输入

3.栈单个的输出

4.栈的检测

1.退出实验

请选择0--4:

2(回车)

 

*栈的共享输入*

栈还未建立!

Enter‘y’tocontinue:

y(回车)

 

结果三:

输入的数据过多时

栈的共享实验

1.栈的建立

2.栈的共享输入

3.栈单个的输出

4.栈的检测

1.退出实验

请选择0--4:

1(回车)

 

*栈的建立*

Enter‘y’tocontinue:

y(回车)

 

*栈的共享输入*

请选择输入方向,正向(0),方向

(1),结束

(2):

0(回车)

请输入数据:

1234567891011–1(回车)

两栈均满,不能进栈!

请选择输入方向,正向(0),方向

(1),结束

(2):

2(回车)

Enter‘y’tocontinue:

y(回车)

 

六、调试小结

函数init(sqstack*s)中少了一条s=(sqstack*)malloc(sizeof(sqstack))语句,这就导致了栈的内存空间无法分配,所以执行出错。

在程序中多加了get(sqstack*s,intl)、check(sqstack*s)、print(sqstack*s)三个函数以便与栈的输入输出以及对栈的检测(不出栈)。

为了在栈的输入之前判断是否已经建栈,在主函数中定义了一个l并定义为0,当l=0时表示还未建栈,l=1时表示已经建栈。

所以只要将l的值传入get(sqstack*s,intl)函数中就可以判断在此之前是否已经建栈。

七、疑问

对标志l的赋值只能放在建栈函数s=init(s)之后,而不能放在它的前面。

如下:

printf("\n");

s=init(s);

printf("Enter'y'tocontunie:

");

scanf("%s",&i);正确

printf("\n");

l=1;

system("cls");

 

printf("\n");

l=1;

s=init(s);

printf("Enter'y'tocontunie:

");

scanf("%s",&i);错误!

l的值任然为0,不赋值为1

printf("\n");

system("cls");

 

Welcome!

!

!

欢迎您的下载,

资料仅供参考!

 

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

当前位置:首页 > 成人教育 > 远程网络教育

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2