栈的共享数据结构Word下载.docx
《栈的共享数据结构Word下载.docx》由会员分享,可在线阅读,更多相关《栈的共享数据结构Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
{
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个栈
的栈顶指针
top[1]=maxsize;
returns;
}
intpush(sqstack*s,datatypex,intk)//入栈操作,s是栈顶指针,x是要插入的数,k是栈号
if(s->
top[0]+1==s->
top[1])
printf("
\n"
);
两个栈均满,不能进栈!
\n"
//判断是否栈满
return0;
if(k==0)
top[k]++;
//改栈顶指针加1或减1,来选择不满的栈else
top[k]--;
data[s->
top[k]]=x;
//将X插入当前栈顶return1;
intpop(sqstack*s,intk)//出栈操作,栈顶元素由参数x返回
intx;
if((k==0&
&
top[0]==-1)||(k==1&
top[1]==maxsize))
栈空,不能退栈!
\n\n"
return0;
x=s->
top[k]];
//区栈顶元素给Xif(k==0)
//改栈顶指针加1或减1,来选择不满的栈
else
returnx;
voidget(sqstack*s,intl)//元素输入函数,l来判断是否已经建栈
intk=0,x;
while(k==1||k==0)
if(l==0)
栈还未建立!
break;
请选择输入方向,正向(0),方向
(1),结束
(2):
"
//选择要输入的栈号,并
输入元素
scanf("
%d"
&
k);
if(k==0|k==1)
x=0;
请输入数据:
"
while(x!
=-1)
x);
if(x==-1)
break;
push(s,x,k);
voidcheck(sqstack*s)//检测栈内的元素但并不输出
inti,l=0;
while(l==0||l==1)
请选择输出方向,正向(0),方向
(1),结束
(2):
scanf("
l);
if(l==2)break;
elseif((l==0&
top[0]==-1)||(l==1&
continue;
elseif(l==0)
正向数据为:
for(i=0;
i<
=s->
top[l];
i++)
%4d"
s->
data[i]);
printf("
\n\n"
反向数据为:
for(i=maxsize-1;
i>
i--)
voidprint(sqstack*s)//元素输出函数
intx,z=1,f=1,l=0;
请选择输出方向,正向(0),方向
(1):
x=pop(s,l);
if(x==0)
选择'
1'
继续,'
0'
结束输出:
if(l==1)continue;
elsebreak;
正向第%d个:
%d\n"
z,x);
z++;
反向第%d个:
f,x);
f++;
voidmenu()//菜单函数
栈的共享实验\n"
);
==================================\n"
1.栈的建立\n"
2.栈的共享输入\n"
3.栈单个的输出\n"
4.栈的检测\n"
0.退出实验\n"
voidmain()//主函数
inth,k,l=0;
//定义’l’为标志,判断是否已建栈,如未建立l=0,否则l=1
chari;
sqstack*s;
for(;
;
)
menu();
请选择0--4:
h);
if(h<
0||h>
4)
\n输人错误!
Enter'
y'
tocontunie:
%s"
i);
system("
cls"
elseswitch(h)
case1:
**********************************************\n"
*栈的建立*\n"
s=init(s);
//栈的建立
l=1;
case2:
*******************************************\n"
*栈的共享输入*\n"
******************************************\n"
get(s,l);
//栈的输入
case3:
*栈单个的输出*\n"
***********************************************\n"
print(s);
//栈的单个输出printf("
case4:
*栈的检测*\n"
check(s);
//对栈内元素的检测printf("
case0:
system("
*再见!
*\n"
五、运算结果
结果一:
0号栈输入元素(1,2,3,4,7,8,10),1号栈输入元素(0,5,6)栈的共享实验
Enter‘y’tocontinue:
y(回车)
*栈的共享输入*
请选择输入方向,正向(0),方向
请输入数据:
12347810–1
(1),结束
(2):
0
(回车)
1
056–1(回车)
2
y
*栈的检测*
正向数据为:
12347810
反向数据为:
056
*栈的单个输出*
请选择输出方向,正向(0),方向
(1):
0(回车)
正向第1个:
10
正向第2个:
8
正向第3个:
17
正向第4个:
4
正向第5个:
3
正向第6个:
正向第7个:
栈空,不能退栈!
选择'
继续,'
1(回车)
反向第1个:
6
反向第2个:
5
反向第3个:
栈的共享实验
1.栈的建立
2.栈的共享输入
3.栈单个的输出
4.栈的检测
0.
退
出
实验
请
选
择
0--4:
2(回车)
0.退出实验
请选择0--4:
请选择输入方向,正向(0),方向
(1),结束
(2):
1234567891011–1(回车)两栈均满,不能进栈!
六、调试小结
函数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)之后,而不能放在它的前面。
如下:
s=init(s);
正确
错误!
l的值任然为0,不赋值为1printf("