双栈共用存储空间

*在学习栈的过程中,如果有两个相同元素类型的栈(一长一短)那么如果分配一个相同大小的maxsize,很容易造成一个栈没有只有很少的元素而另一个栈达到了maxsize。如何解决这个问题,我在《大话数据结构》一书中找到了解决方案,双栈公用一个较大的存储空间,使一个栈的栈底处于数组的0位,另一个栈的栈底处于(maxsize-1)位

如图所示*

#include<stdio.h>   
#include<stdlib.h>    
#include<time.h>

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define maxsize 20 /* 存储空间初始分配量 */

typedef int status;
typedef int elemtype; 

typedef struct doustack{
    elemtype data[maxsize];
    int top1,top2;
}doustack;

//初始化栈 
status initstack(doustack *s){
    s->top1=-1;
    s->top2=maxsize;
    return OK;
}

status visit(elemtype c){

    printf("%d ",c);
}

//返回栈长
status stacklength(doustack *s){
    printf("栈1的长度为%d\n",s->top1+1);
    printf("栈2的长度为%d\n",maxsize-(s->top2));
    return OK;
} 

//判断栈是否为空
status emptystack(doustack *s){
    if(s->top1==-1){
        printf("栈1为空\n");
    }
    else{
        printf("栈1非空\n");
    }
    if(s->top2==maxsize){
        printf("栈2为空\n");
    }
    else{
        printf("栈2非空\n");
    }
    return OK;
} 

//将元素压入栈中
status push(doustack *s,elemtype data,int stacknumber){
    /*//判断栈是否已满 
    if(s->top1+1==s->top2){
        printf("栈已满\n");
        return ERROR;
    }
    //压入1if(stacknumber==1){
        s->top1++;
        s->data[s->top1]=data;
    }
    //压入2if(stacknumber==2){
        s->top2--;
        s->data[s->top2]=data;
    } 
    return OK;*/
    if(s->top1+1==s->top2){
        return ERROR;
        printf("栈已满\n"); 
    }
    if(stacknumber==1){
        s->top1++;
        s->data[s->top1]=data;
    }
    if(stacknumber==2){
        s->top2--;
        s->data[s->top2]=data;
    }
} 

//元素出栈
status pop(doustack *s,elemtype data,int stacknumber){
    if(stacknumber==1){
        if(s->top1==-1)
        return ERROR;
        data=s->data[s->top1];
        s->top1--;
        printf("出栈元素为%d\n",data);
    }

    if(stacknumber==2){
        if(s->top2==maxsize)
        return ERROR;
        data=s->data[s->top2];
        s->top2++;
        printf("出栈元素为%d\n",data);
    }
} 

//遍历栈
status traversestack(doustack *s){
    if(s->top1==-1){
        return ERROR;//判空栈 
    }
    else{
        int i=0;
        while(i<=s->top1){
            visit(s->data[i]);
            i++;
          }
        }
        printf("\n");   
    if(s->top2==maxsize){
        return ERROR;
    }
    else{
        int i=s->top2;
        while(i<maxsize){
            visit(s->data[i]);
            i++;
        }
    }
    printf("\n");
} 

int main(void){
    doustack s;
    initstack(&s);
    stacklength(&s);
    int i;
    for(i=0;i<maxsize/2;i++){
        push(&s,i,1);
    }
    for(i=maxsize;i>maxsize/2;i--){
        push(&s,i,2);
    }
    traversestack(&s);
    pop(&s,i,1);
    pop(&s,i,2);
    traversestack(&s);
    stacklength(&s);
}
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值