栈的实现(C语言版)

Stack.h

#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef int SelemType;
typedef int Status;

/*01 栈的顺序存储结构*/
typedef struct Sqstack
{
    SelemType data[MAXSIZE];
    int top;
}sqstack;

/*02 两栈共享空间*/
typedef struct SdoubleStack
{
    SelemType data[MAXSIZE];
    int top1;
    int top2;
}Sdstack;

/*03 栈的链式存储结构*/
typedef struct NodeStack
{
    SelemType data;
    struct NodeStack *next;
}Snode, *Slink;

typedef struct StackLink
{
    Slink top;
    int count;
}stackLink;

Stack.c

/*01 顺序栈的初始化*/
Status InitStack(sqstack *S)
{
    S->top = -1;
    
    return OK;
}

/*02 顺序栈的压栈*/
Status Push(sqstack *S, SelemType e)
{
    if(S->top == MAXSIZE-1)
    {
        return ERROR;
    }
    
    S->top++;
    S->data[S->top] = e;
    
    return ERROR;
}

/*03 顺序栈的弹栈*/
Status Pop(sqstack *S, SelemType *e)
{
    if(S->top == -1)
    {
        return ERROR;
    }
    
    *e = S->data[S->top];
    S->top--;
    
    return OK;
}

/*04 打印顺序栈的元素*/
void PrintStack(sqstack s)
{
    while(s.top != -1)
    {
        printf("%d ", s.data[s.top]);
        s.top--;
    }
    
    printf("\n");
}

/*01 链栈的初始化*/
Status InitStack(stackLink *S)
{
    S->top = NULL;
    S->count = 0;
    
    return OK;
}

/*02 链栈的入栈*/
Status Push(stackLink *S, SelemType e)
{
    Slink s = (Slink)malloc(sizeof(Snode));
    if(!s)
    {
        return ERROR;
    }
    
    s->data = e;
    s->next = S->top;
    S->top = s;
    S->count++;
    
    return OK;
}

/*03 链栈的弹栈*/
Status Pop(stackLink *S, SelemType *e)
{
    Slink p = NULL;
    if(S->top == NULL)
    {
        return ERROR;
    }
    
    p = S->top;
    *e = p->data;
    S->top = p->next;
    free(p);
    S->count--;
    return OK;
}

/*04 打印链栈的元素*/
void PrintStack(stackLink s)
{
    while(s.top != NULL)
    {
        printf("%d ", s.top->data);
        s.top = s.top->next;
    }
    
    printf("\n");
}

/*01 两栈共享空间 初始化*/
Status InitStack(Sdstack *S)
{
    S->top1 = -1;
    S->top2 = MAXSIZE;
    
    return OK;
}

/*02 压栈*/
Status Push(Sdstack *S, SelemType e, int Stacknumber)
{
    if(S->top1+1 == S->top2)
    {
        return ERROR;
    }
    if(Stacknumber == 1)
    {
        S->top1++;
        S->data[S->top1] = e;
    }
    else if(Stacknumber == 2)
    {
        S->top2--;
        S->data[S->top2] = e;
    }
    else;
    
    return OK;
    
}

/*03 弹栈*/
Status Pop(Sdstack *S, SelemType *e, int Stacknumber)
{
    if(Stacknumber == 1)
    {
        if(S->top1 == -1)
        {
            return ERROR;
        }
        else
        {
            *e = S->data[S->top1];
            S->top1--;
        }
    }
    
    else if(Stacknumber == 2)
    {
        if(S->top2 == MAXSIZE)
        {
            return ERROR;
        }
        else
        {
            *e = S->data[S->top2];
            S->top2++;
        }
    }
    else;
    
    return OK;
}

/*04 打印栈中的元素*/
void PrintStack(Sdstack s, int Stacknumber)
{
    if(Stacknumber == 1)
    {
        while(s.top1 != -1)
        {
            printf("%d ", s.data[s.top1]);
            s.top1--;
        }
        printf("\n");
    }
    else if(Stacknumber == 2)
    {
        while(s.top2 != MAXSIZE)
        {
            printf("%d ", s.data[s.top2]);
            s.top2++;
        }
        printf("\n");
    }
    else;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值