两栈共享空间(数组)

两栈共享空间(数组)

本文参考资料:《大话数据结构》

两栈共享空间

两栈共享空间的结构代码

/* 两栈共享空间结构 */
typedef struct
{
   
    SElemType data[MAXSIZE];
    int top1;	//栈1栈顶指针
    int top2;	//栈2栈顶指针
}SqDoubleStack;

对于两栈共享空间的push方法,除了要插入元素值参数外,还需要有一个判断是栈1还是栈2的栈号参数stackNumber;

/* 插入元素e为新的栈顶元素 */
Status Push(SqDoubleStack *S, SElemType e, int stackNumber)
{
   
    if(S->top1+1 == S->top2)	//栈已满,不能再push新元素了
        return ERROR;
    if(stackNumber == 1)	//栈1有元素进栈
        S->data[++S->top1] = e;	//若栈1则先top1+1后给数组元素赋值
    else if(stackNumber == 2)	//栈2有元素进栈
        S->data[--S->top2] = e;	//若栈2则先top2-1后给数组元素赋值
    return OK;
}

​ 因为在开始已经判断了是否有栈满的情况,所以后面的top1+1或top2-1是不担心溢出问题的。

​ 对于两栈共享空间的pop方法,参数就只是判断栈1栈2的参数stackNumber,代码如下:

/* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
Status Pop(SqDoubleStack *S,SElemType *e, int stackNumber)
{
   
    if(stackNumber == 1)
    {
   
        if(S->top1 == -1)
            return ERROR;	//说明栈1已经是空栈,溢出
        *e = S->data[S->top1--];	//将栈1的栈顶元素出栈
    } else if(stackNumber == 2){
   
        if(S->top2 == MAXSIZE)
            return ERROR;	//说明栈2已经是空栈,溢出
        *e = S->data[S->top2++];	//将栈2的栈顶元素出栈
    }
    return OK;
}

​ 事实上,使用这样的数据结构,通常是当两个栈的空间需求有相反关系时,也就是一个栈增长时另一个栈在缩短的情况。就像买买股票,你买入时,一定是有一个你不知道的让人在做卖出操作。有人赚钱,就一定是有人赔钱。这样使用两栈共享空间存储方法才有比较大的意义。否则两个栈都在不停地增长,那很快就会因栈满而溢出了。

​ 当然了,这只是针对两个具有相同数据类型的栈的一个设计上的技巧,如果不是相同的数据类型,这种方法不但不能更好地处理问题,反而会使问题变得更复杂。

#include <stdio.h>
#include <stdbool.h>
#define MAXSIZE 100
#define ERROR 0
#define OK 1
typedef 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值