| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1720 人关注过本帖
标题:[求助]菜鸟初学S1,S2共用一个栈
只看楼主 加入收藏
HaPpY随心
Rank: 1
等 级:新手上路
帖 子:119
专家分:0
注 册:2007-9-28
收藏
 问题点数:0 回复次数:9 
[求助]菜鸟初学S1,S2共用一个栈
设有两个栈S1,S2都采用顺序栈方式,并且共享一个存储区,采用栈顶相向、迎面增长的存贮方式


搜索更多相关主题的帖子: 初学 顺序 存贮 
2007-10-27 10:30
HaPpY随心
Rank: 1
等 级:新手上路
帖 子:119
专家分:0
注 册:2007-9-28
收藏
得分:0 

#include <stdio.h>
#include <stdlib.h>
#define maxsize 100
typedef int datatype;
typedef struct
{
datatype stack[maxsize];
int top1;
int top2;
}seqstack;
seqstack *s;
void initstack()
{
if(!s);
else
{s->top1=-1;
s->top2=maxsize;
}
}
void push1(seqstack *q,datatype x)
{
if(q->top1==s->top2);
else
{
s->top1++;
s->stack[s->top1]=x;
}
}
void push2(seqstack *q,datatype x)
{
if(q->top2==s->top1);
else
{
s->top2--;
s->stack[s->top2]=x;
}
}
datatype pop(seqstack *q)
{
if(s->top1==0&&s->top2==maxsize-1) return 0;
if(q->top1==s->top1)
{
s->top1--;
return s->stack[s->top1+1];
}
if(q->top2==s->top2)
{
s->top2++;
return s->stack[s->top2-1];
}
}
int stackempty()
{

if(s->top1==-1&&s->top2==maxsize) return 1;
else return 0;

}

void display()
{
int t,r;
t=s->top1;
r=s->top2;
if(s->top1==-1 )printf("s1 is empty!");
else
{printf("\ns1:");
while(t!=-1)
{t--;
printf("%d ",s->stack[t]);
}
}
if(s->top2==maxsize)printf("s2 is empty!");
else
{
printf("\ns2:");
while(r!=maxsize)
{
r++;
printf("%d ",s->stack[r]);
}
}
}
int main()
{
initstack();
seqstack *s1,*s2;
s1=s;
s2=s;
s1->top2=-2;
s2->top1=-2;
int a[6]={1,2,3,4,5,6};
int i;
int b[5]={9,8,7,6,5};
for(i=0;i<6;i++) push1(s1,a[i]);
for(i=0;i<5;i++) push2(s2,b[i]);
printf("output the stack:");
display();
}

2007-10-27 10:30
zxc1998
Rank: 1
等 级:新手上路
威 望:1
帖 子:133
专家分:0
注 册:2007-3-21
收藏
得分:0 
你在入栈的时候已经分别用了push1和push2,参数中为什么还要用q传递参数,
不用q你再试试
2007-10-29 22:10
静思
Rank: 3Rank: 3
来 自:沈阳
等 级:新手上路
威 望:8
帖 子:630
专家分:0
注 册:2006-2-28
收藏
得分:0 

楼主的initstack()函数有错误,你将s设置为全局变量,编译时会将其赋值为0,没有执行initstack函数中的else分支,导致程序在运行过程中产生异常。


英者自知,雄者自胜
2007-10-29 22:38
静思
Rank: 3Rank: 3
来 自:沈阳
等 级:新手上路
威 望:8
帖 子:630
专家分:0
注 册:2006-2-28
收藏
得分:0 

楼主这样实现比较麻烦,建议改为一种比较简单且有效的实现方式
typedef struct
{
ElemType stack[maxsize];
int Tops[2];
}seqstack;
seqstack S;
S.top[0]存放栈1中栈顶元素在数组中的下标,S.top[1]中存放的是栈2中栈顶元素在数组中的下标,其中栈1在数组的低端,栈2在数组的高端。
当进行压栈操作时,push()中的参数中增加一个标记,以表明对栈1操作还是对栈2操作,这样就不需要写两个push()函数了。
Tops[0]和Tops[1]共同维护着这个共享栈



英者自知,雄者自胜
2007-10-29 22:52
HaPpY随心
Rank: 1
等 级:新手上路
帖 子:119
专家分:0
注 册:2007-9-28
收藏
得分:0 
回复:(静思)楼主这样实现比较麻烦,建议改为一种比...
哦,我试着重新写
2007-10-31 15:00
HaPpY随心
Rank: 1
等 级:新手上路
帖 子:119
专家分:0
注 册:2007-9-28
收藏
得分:0 

//还是写不好...
#include <stdio.h>
#include <stdlib.h>
#define maxsize 100
typedef int datatype;
typedef struct
{
datatype stack[maxsize];
int top[1];

}seqstack;

seqstack *initstack()
{
seqstack *s;
s=(seqstack *)malloc(sizeof (seqstack));
if(!s)
{printf("no enough room");}
else
{s->top[0]=-1;
s->top[1]=maxsize-1;
return s;
}
}
seqstack * push1(seqstack *s,datatype x)
{
if(s->top[0]==s->top[1])
{printf("1\n");return NULL;}
else
{
s->top[0]++;
s->stack[s->top[0]]=x;
return s;
}
}
seqstack * push2(seqstack *s,datatype x)
{
if(s->top[0]==s->top[1])
{printf("2\n");}
else
{
s->top[1]--;
s->stack[s->top[1]]=x;
return s;
}
}
datatype pop1(seqstack *s)
{
int y;
if(s->top[0]==-1)
{printf("1 is empty\n");return 0;}
else
{
s->top[0]--;
y=s->stack[s->top[0]+1];
return y;
}
}

datatype pop2(seqstack *s)
{
int y;
if(s->top[1]==maxsize-1)
{printf("2 is empty\n");return 0;}
else
{
s->top[1]++;
y=s->stack[s->top[1]-1];
return y;
}
}
int stackempty1(seqstack *s)
{

if(s->top[0]==-1) return 1;
else return 0;

}
int stackempty2(seqstack *s)
{
if(s->top[1]==maxsize-1) return 1;
else return 0;
}

main()
{
int i,a[6],b[5];
seqstack *s1,*s2;
s1=initstack();
s2=s1;
a[6]={1,2,3,4,5,6};

b[5]={9,8,7,6,5};
for(i=0;i<6;i++) push1(s1,a[i]);
for(i=0;i<5;i++) push2(s2,b[i]);
printf("output the stack:");
while(!stackempty1(s1)) printf("%d",pop1(s1));
printf("\n");
}

2007-11-08 20:38
静思
Rank: 3Rank: 3
来 自:沈阳
等 级:新手上路
威 望:8
帖 子:630
专家分:0
注 册:2006-2-28
收藏
得分:0 
#define int StackNo
#define MAXSIZE 200
typedef struct
{
ElemType stack[MAXSIZE];
int Tops[2];//Tops[0]代表数组低端栈下标,Tops[1]代表数组高端栈下标
}Dstack;

/*初始化*/
void InitStack(StackNo sno,Dstack &S)
{
switch(sno){
case 0:S.top[0]=-1;break;
case 1:S.top[1]=MAXSIZE;break;
}

void Push(SElemtype e,StackNo sno,Dstack &S)
{//sno只能取0或1
if (Full(S))//栈满
//打印相应提示信息
else
  {
    switch(sno){
case 0:S.top[0]++;break;
case 1:S.top[1]--;break;
}
S.stack[S.Tops[sno]]=e;
}
}

void Pop(SElemType &e,StackNo sno,Dstack &S)
{
if(Empty(sno,S)//判断栈是否为空
//输出相应的信息
 else{
e=S.stack=S.stack[S.Tops[sno]];
switch(sno){
case 0:S.Tops[0]--;break;
case 1:S.Tops[1]++;break;
}
}
}

SElemType GetTop(StackNo sno,Dstack &S)
{
if(Empty(sno,S))
//栈空,返回调用程序
else
return S.stack[S.Tops[sno]];
}

bool Empty(StackNo sno,Dstack S)
{
switch(sno){
case 0:return (S.Tops[0]==-1);break;
case 1:return (S.Tops[1]==MAXSIZE);break;
}
}

bool Full(Dstack S)
{
return (S.Tops[0]+1==S.Tops[1]);
}


以上是用到的一些函数,楼主可以写个主函数自己测验一下


 


[此贴子已经被作者于2007-11-9 9:04:13编辑过]


英者自知,雄者自胜
2007-11-09 09:03
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
的确可以加设一个参数表示对哪个栈进行操作,这样就不用写两个相当于重复的函数了.

倚天照海花无数,流水高山心自知。
2007-11-09 09:26
HaPpY随心
Rank: 1
等 级:新手上路
帖 子:119
专家分:0
注 册:2007-9-28
收藏
得分:0 
数据结构好难..
还要请斑竹多多指教呢
2007-11-09 12:55
快速回复:[求助]菜鸟初学S1,S2共用一个栈
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017716 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved