栈的链式存储实现

#define ERROR           0
#define OK              1
#define OVERFLOW       -1

typedef int Status;
typedef int SElemType;
typedef struct SNode
{
    SElemType data;
    struct SNode *next;
}SNode;
typedef struct
{
    SNode *top;
}LinkStack;

void InitStack(LinkStack *S)
{
    assert(S);

    S->top = NULL;
}

void DestroyStack(LinkStack *S)
{
    assert(S);
    SNode *tmp = S->top;

    while (tmp)
    {
        S->top = tmp->next;
        free(tmp);
        tmp = S->top;
    }
}

Status StackEmpty(LinkStack *S)
{
    assert(S);

    return NULL == S->top;
}

Status Push(LinkStack *S, SElemType e)
{
    assert(S);
    SNode *tmp;

    tmp = (SNode *)malloc(sizeof(SNode));
    if (!tmp)
        exit(OVERFLOW);

    tmp->data = e;
    tmp->next = S->top;
    S->top = tmp;

    return OK;
}

Status Pop(LinkStack *S, SElemType *e)
{
    assert(S);
    SNode *tmp;

    if (StackEmpty(S))
        return ERROR;

    tmp = S->top;
    S->top = tmp->next;
    if (e)
        *e = tmp->data;
    free(tmp);

    return OK;
}

Status GetTop(LinkStack *S, SElemType *e)
{
    assert(S);

    if (StackEmpty(S))
        return ERROR;

    *e = S->top->data;

    return OK;
}

void StackTraverse(LinkStack *S, void(*visit)(SElemType *))
{
    assert(S&&visit);
    SNode *tmp;

    tmp = S->top;
    while (tmp)
    {
        visit(&tmp->data);
        tmp = tmp->next;
    }
}

    测试程序:

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

void visit(SElemType *e)
{
    putchar(*e);
}

int main()
{
    LinkStack S;
    int c;

    InitStack(&S);

    while ('\n' != (c = getchar()))
        Push(&S, c);

    StackTraverse(&S, visit);
    putchar('\n');
    while (!StackEmpty(&S))
    {
        Pop(&S, &c);
        visit(&c);
    }

    DestroyStack(&S);

    putchar('\n');
    system("pause");
    return 0;
}

    运行结果:

    栈的顺序存储实现请戳这里

转载于:https://www.cnblogs.com/inori/p/5011906.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值