共享空间的栈

当我们需要两个栈的存储数据的时候,可能会出现其中一个栈不够用,另外一个栈又不经常使用的情况,可以试着把两个栈合体。这是一种策略,在日常生活中也有类似的情况,比如情侣,有的情侣毕业了还是分开住,有的情侣可能会想一起租房子不是更好嘛,他好,我也好。

 

共享栈的表示

typedef int Elemtype;
typedef struct
{
    Elemtype data[size];
    int top1;//栈1指针 
    int top2;//栈2指针 
} Stack;

 

 操作集

入栈

/*
*StackNum为栈的号数 
*/
int push( Stack *s , Elemtype e , int StackNum )
{
    if( s->top1 + 1 == s->top2 )
    {
        return 0;
    }
    if( StackNum == 1 )
    {
        s->data[++s->top1] = e;
    }
    else
    {
        s->data[--s->top2] = e;
    }
    
    return 1;
}

出栈

int pop( Stack *s , Elemtype *e , int StackNum )
{
    if( StackNum == 1 )
    {
        if( s->top1 == -1 ) return 0;
        
        *e = s->data[s->top1--];
    }
    else if( StackNum == 2 )
    {
        if( s->top2 == size ) return 0;
        
        *e = s->data[s->top2++];
    }
    
    return 1;
}

遍历

void display( Stack *s )
{
    int i;

    printf("栈1: ");
    for( i = 0 ; i <= s->top1 ; i++ )
    {
        printf("%d ",s->data[i]);
    }

    printf("\n栈2: ");
    for( i = size - 1 ; i >= s->top2 ; i-- )
    {
        printf("%d ",s->data[i]);
    }
    printf("\n");
}

 

全部代码

#include<stdio.h>
#define size 20

typedef int Elemtype;
typedef struct
{
    Elemtype data[size];
    int top1;//栈1指针 
    int top2;//栈2指针 
} Stack;

void init( Stack *s )
{
    s->top1 = -1;
    s->top2 = size;
}
/*
*StackNum为栈的号数 
*/
int push( Stack *s , Elemtype e , int StackNum )
{
    if( s->top1 + 1 == s->top2 )
    {
        return 0;
    }
    if( StackNum == 1 )
    {
        s->data[++s->top1] = e;
    }
    else
    {
        s->data[--s->top2] = e;
    }
    
    return 1;
}

int pop( Stack *s , Elemtype *e , int StackNum )
{
    if( StackNum == 1 )
    {
        if( s->top1 == -1 ) return 0;
        
        *e = s->data[s->top1--];
    }
    else if( StackNum == 2 )
    {
        if( s->top2 == size ) return 0;
        
        *e = s->data[s->top2++];
    }
    
    return 1;
}

void display( Stack *s )
{
    int i;

    printf("栈1: ");
    for( i = 0 ; i <= s->top1 ; i++ )
    {
        printf("%d ",s->data[i]);
    }

    printf("\n栈2: ");
    for( i = size - 1 ; i >= s->top2 ; i-- )
    {
        printf("%d ",s->data[i]);
    }
    printf("\n");
}

int main()
{
    Stack L;
    init(&L);
    int n;
    
    push(&L,3,1);
    push(&L,4,1);
    push(&L,12,2);
    push(&L,11,2);
    push(&L,13,2);    
    display(&L);
    
    pop(&L,&n,1);
    pop(&L,&n,2);
    display(&L);
    
    return 0;
}

 

 

posted @ 2020-08-08 11:27  Rego  阅读(205)  评论(0编辑  收藏  举报