两栈共享存储空间(用一个数组存储两个栈)

思想:先开辟一段连续的存储空间(一个数组);两个栈栈顶分别指向数组的两端,随着push操作两栈的栈顶向数组内侧移动;随着pop操作两栈的栈顶向数组外侧移动。


#include <stdio.h>
#include <stdlib.h>
//栈的顺序存储结构,用一维数组实现


#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100
typedef int Status;
typedef int ElemType;


//用一个数组来存储两个栈;思想是两个栈的栈顶分别在数组的两端
typedef struct{
    ElemType data[MAXSIZE];
    int top1;//栈1的栈顶
    int top2;//栈2的栈顶
}DoubleStack;
//1. 初始化操作
Status InitDS(DoubleStack *DS){
    memset(DS->data,'\0',sizeof(ElemType)*MAXSIZE);/*注意memset是以字节来置数的,置零时不必考虑这么多,但置其他数时必须考虑基本元素的数据类型*/
    DS->top1=-1;
    DS->top2=MAXSIZE;
    return OK;
}


//2. 对于两栈共享空间的push方法,我们除了要插入元素值参数外,还需要有一个判断是栈1还是栈2的栈号参数
Status DoublePush(DoubleStack *DS,ElemType e,int s_number){
    if(DS->top1+1==DS->top2){
        //当两个栈顶重合时,数组已经满了
        return ERROR;
    }
    if(s_number==1){
        //往栈1插入元素
        ++(DS->top1);
        DS->data[DS->top1]=e;
    }else if(s_number==2){
        --(DS->top2);
        DS->data[DS->top2]=e;
    }
    return OK;
}
//两栈共享空间的pop方法
Status DoublePop(DoubleStack *DS,ElemType *e,int s_number){
    if(DS->top1==-1 && DS->top2==MAXSIZE){
        printf("两栈均为空!,不能执行此项操作!");
        return ERROR;
    }else if(DS->top1==-1){
        //栈1为空,只能对2进行弹栈
        if(s_number!=2){
            printf("此时栈1为空,栈的标号必须为2!\n");
            return ERROR;
        }
    }else if(DS->top2==MAXSIZE){
        if(s_number!=1){
            printf("此时栈2为空,栈的标号必须为1!\n");
            return ERROR;
        }
    }
    if(1==s_number){
        *e=DS->data[DS->top1];
        --DS->top1;
    }else if(2==s_number){
        *e=DS->data[DS->top2];
        ++DS->top2;
    }else{
        printf("请检查输入的栈号,必须为1或2\n");
        return ERROR;
    }
    return OK;
}
int main()
{
    
    DoubleStack DS;
    if(OK==InitDS(&DS)){
        printf("初始化成功!");
    }
    int e,s_number;
    printf("想要插入的值及栈号\n");
    while(2==scanf("%d,%d",&e,&s_number)){
            if(OK==DoublePush(&DS,e,s_number)){
                int i,j;
                i=0;
                j=MAXSIZE-1;
                printf("栈1的元素为:");
                while(i<=DS.top1){
                    printf("%d\t",DS.data[i++]);
                }
                printf("\n栈2的元素为:");
                while(j>=DS.top2){
                    printf("%d\t",DS.data[j--]);
                }
            }


    }
    printf("输入出栈的栈号\n");
    while(1==scanf("%d",&s_number)){
        printf("出栈的值为:");
        if(OK==DoublePop(&DS,&e,s_number))
            printf("%d\t",e);
    }


    return 0;
}

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值