数据结构----栈(共享栈,链栈)

共享栈:
利用栈底位置相对不变的特性,可让两个顺序栈共享一个一维数据空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸。
在这里插入图片描述
连个栈的栈顶指针都指向栈顶元素,top0=-1时,0号占位空,top1=MaxSize-1时1号栈为空;

    仅当两个栈顶指针相邻(top1-top0=1)时,判断为栈满。当0号栈进栈时,top0先加1,在赋值,1号栈进栈时top1先减去1在赋值;出栈时刚刚相反。

          共享栈时为了有效利用存储空间,两个栈的空间相互调节,只在整个存储空间被占满菜发生上溢。

代码如下:

typedef struct
{
	SElemType data[MAXSIZE];
	int top1;
	int top2;
	
 } SqDoubleStack;
 Status Push(SqDoubleStack *S,SElemType e,int stackNumber)
 {
 	if(S->top1+1==S->top2)
 		return ERROR;
 	if(stackNumber==1)
 		S->data[++S->top1]=e;
 	else if(stackNumber==2)
 		S->data[--S->top2]=e;
 	return OK;
 }

在大话数据结构中如此描述
在这里插入图片描述
他们是在数组的两端,向中间靠拢,top1和top2是两个栈的栈顶指针,只要这两个不见面,两个栈就能使用。栈1空是,top1==-1,top2==n时,栈2为空。

栈满的情况:

若栈2空,top1 == n - 1,栈1满;栈1空,top2==0,栈2满;更多的情况是top1+1 == top2为栈满。
链栈:
在这里插入图片描述
用数组存储栈会出现栈满的情况而对于链栈来说不存在这种情况。
链栈的结构代码如下:

typedef struct StackNode
{
	int data;
	struct StackNode *next;
}StackNode,*LinkStackPtr;
typedef struct LinkStack
{
	LinkStackPtr top;
	int count;
}LinkStack;

入栈:

int push(SqStack *s,int e)
{
	LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));
	s->data;
	s->next=s->top;
	s->top=s;
	s->count++;
	return success;
}

出栈:

int pop(SqStack *s,int *e)
{
	LinkstackPtr p;
	if(StackEmpty(*s))
	{
		return error;
	}
	*e=s->top->data;
	p=s->top;
	s->top=s->top->next;
	free(p);
	s->count--;
	return success;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值