栈的顺序表示法(2种方法实现),链式实现,共享栈的操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33883389/article/details/81490481
#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCRMENT 10
#define OK 1
#define ERROR 0
typedef int SElemType;
typedef int Status;


/*栈的顺序表示法1*/
typedef struct
{
    SElemType *base;
    SElemType *top;
    int stacksize;
} SqStackOne;

/*栈的顺序表示法2*/
typedef struct
{
    SElemType data[STACK_INIT_SIZE];
    int top;
} SqStackTwo;


/*链式栈的表示*/
typedef struct LinkNode
{
    SElemType data;
    struct LinkNode *next;
}*LiStack;


/*共享栈的实现*/
typedef struct
{
    SElemType data[STACK_INIT_SIZE];
    int top[2];//top为两个栈顶的指针
} Stk;

Status InitStack_one(SqStackOne &S);

Status GetTop_one(SqStackOne S,SElemType &e);

Status Push_one(SqStackOne &S,SElemType e);

Status Pop_one(SqStackOne &S,SElemType &e);

void InitStack_two(SqStackTwo &S);

Status GetTop_two(SqStackTwo S,SElemType &e);

Status Push_two(SqStackTwo &S,SElemType e);

Status Pop_two(SqStackTwo &S,SElemType &e);

//共享栈的压栈操作
Status Push_Stk(Stk S,int i,SElemType e);

//共享栈的压栈操作
Status Push_Stk(Stk S,int i,SElemType e);
int main()
{
    SqStackOne s;
    InitStack_one(s);
    int d;

    for(int i=0; i<5; i++)
        Push_one(s,i);
    for(int i=0; i<5; i++)
    {
        Pop_one(s,d);
        printf("%d\n",d);
    }
    return 0;
}
Status InitStack_one(SqStackOne &S)
{
    S.base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    if(!S.base)
        return ERROR;
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
}//InitStack_one

void InitStack_two(SqStackTwo &S)
{
    S.top = -1;
}//InitStack_two

Status GetTop_one(SqStackOne S,SElemType &e)
{
    if(S.base == S.top)
        return ERROR;
    e = *--S.top;
    return OK;
}

Status GetTop_two(SqStackTwo S,SElemType &e)
{
    if(S.top == -1)
        return ERROR;
    e = S.data[S.top];
    return OK;
}

Status Push_one(SqStackOne &S,SElemType e)
{
    if(S.top -S.base>= S.stacksize)//栈满了
    {
        S.base = (SElemType*)realloc(S.base,(S.stacksize + STACKINCRMENT)*sizeof(SElemType));
        if(!S.base)
            return ERROR;

        //因为base是新的地址
        S.top = S.base + S.stacksize;//重新指定栈顶

        S.stacksize +=STACKINCRMENT;
    }
    *S.top++ = e;
    return OK;
}

Status Push_two(SqStackTwo &S,SElemType e)
{

    if(S.top ==STACK_INIT_SIZE-1)//栈满了
        return ERROR;

    S.data[++S.top] = e;

    return OK;
}

Status Pop_one(SqStackOne &S,SElemType &e)
{
    if(S.top == S.base)
        return ERROR;

    e =*--S.top;//先减减
    return OK;

}

Status Pop_two(SqStackTwo &S,SElemType &e)
{
    if(S.top == -1)//栈为空
        return ERROR;

    e = S.data[S.top--];
    return OK;

}

//共享栈的压栈操作
Status Push_Stk(Stk S,int i,SElemType e)
{
    if(i<0||i>1)
    {
        printf("栈号不对\n");
        return ERROR;
    }

    if(S.top[1]-S.top[0] == 1)
    {
        printf("栈已满\n");
        return ERROR;
    }

    switch(i)
    {
    case 0:
        S.data[++S.top[0]] = e;
        return 1;
    case 1:
        S.data[--S.top[1]] = e;
        return 1;
    }

}//end Push_stk

//共享栈的弹栈操作
Status Pop_Stk(Stk S,int i,SElemType &e)
{
    if(i<0||i>1)
    {
        printf("栈号不对\n");
        return ERROR;
    }

    switch(i)
    {
    case 0:
        if(S.top[0] == -1)
        {
            printf("栈为空\n");
            return ERROR;
        }
        e = S.data[S.top[0]--];
    case 1:
        if(S.top[1] == STACK_INIT_SIZE)
        {
            printf("栈为空\n");
            return ERROR;
        }
        e = S.data[S.top[1]++];
    }
}//end Pop_Stk

猜你喜欢

转载自blog.csdn.net/qq_33883389/article/details/81490481