链栈的表示和实现

//库函数头文件包含
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

//函数状态码定义
#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE -1
#define OVERFLOW   -2

typedef int Status;
typedef int SElemType;

//----------栈的链式存储表示----------------

typedef struct StackNode{
    SElemType data;
    struct StackNode *next;
}StackNode;

typedef struct {
    StackNode *top;
}LinkStack;

//初始化一个空栈
Status InitLStack(LinkStack &LS){
    LS.top = (StackNode *)malloc(sizeof(StackNode));
    if(!LS.top)
        exit(OVERFLOW);
    LS.top->next = NULL;
    return OK;
}

//销毁栈
Status DestoryLStack(LinkStack &LS){
    StackNode *p, *q;
    p = LS.top;
    while(p){
        q = p;
        p = p->next;
        free(q);
    }
    return OK;
}

//清空栈
Status ClearLStack(LinkStack &LS){
    StackNode *p, *q;
    p = LS.top->next;
    LS.top->next = NULL;
    while(!p){
        q = p;
        p = p->next;
        free(q);
    }
    return OK;
}

//判断栈是否为空
bool Is_LStackEmpty(LinkStack LS){
    if(!LS.top->next)
        return true;
    return false;
}

//返回栈顶元素
SElemType GetTop(LinkStack LS){
    if(LS.top->next)
        return LS.top->next->data;
    return ERROR;
}

//入栈
Status PushLStack(LinkStack &LS, SElemType e){
    StackNode *InsertPtr;
    InsertPtr = (StackNode *)malloc(sizeof(StackNode));
    if(!InsertPtr)
        exit(OVERFLOW);                 //储存分配失败

    InsertPtr->data = e;
    InsertPtr->next = LS.top->next;
    LS.top->next = InsertPtr;
    return OK;
}

//出栈
Status PopLStack(LinkStack &LS, SElemType &e){
    StackNode *DelPtr;
    if(!LS.top->next)
        return ERROR;
    DelPtr = LS.top->next;
    e = DelPtr->data;
    LS.top->next = DelPtr->next;
    free(DelPtr);
    return OK;
}

//返回栈长
int LStackLength(LinkStack LS){
    StackNode *p;
    int len = 0;
    p = LS.top->next;
    while(p){
        len++;
        p = p->next;
    }
    return len;
}

//visit()函数
Status Print(SElemType e){
    printf("%d ", e);
    return OK;
}

//遍历栈
Status LStackTraverse(LinkStack LS, Status (*visit)(SElemType)){
    StackNode *p;
    p = LS.top->next;
    while(p){
        if(!visit(p->data))
            return ERROR;
        p = p->next;
    }
    return OK;
}


//主函数
int main(){
    LinkStack S;
    SElemType a;

    InitLStack(S);
    printf("输入5个数字:\n");
    for(int i = 0; i < 5; i++){
        scanf("%d", &a);
        PushLStack(S, a);
    }

    printf("下面是执行遍历操作的输出结果:\n");
    LStackTraverse(S, Print);

    printf("\n下面是返回栈长的结果:\n");
    printf("%d\n", LStackLength(S));

    printf("下面是执行出栈后遍历的结果:\n");
    PopLStack(S, a);
    LStackTraverse(S, Print);

    printf("\n下面是获得栈顶元素的操作:\n%d\n", GetTop(S));

    printf("下面是判断栈是否为空的操作(空输出YES,不空输出NO和栈长):\n");
    if(Is_LStackEmpty(S))
        printf("YES");
    else
        printf("NO  %d", LStackLength(S));
    return 0;
}

下面是对程序的简单测试结果:


评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值