C语言实现栈的链式存储结构

C语言实现栈的链式存储结构

/*
 * @Author: xgh
 * @Date: 2020-06-23 22:25:32
 * @LastEditTime: 2020-06-28 14:44:10
 * @LastEditors: Please set LastEditors
 * @Description: 栈的链式存储结构
 * @FilePath: \VS-CODE-C\.vscode\StackLinkedList\stackLinkedLists.c
 */
#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef int Statue;

#define ERROR 0
#define SUCCESS 1
#define OVER 0
#define EMPTY 0
#define NOT_EMPTY 1

// 栈元素结点
typedef struct StackNode
{
    ElemType data; // 存放栈的数据
    struct StackNode *next;
} StackNode, *LinkStackPtr;

typedef struct LinkStack
{
    LinkStackPtr top; // top指针
    int count;        // 栈元素计数器
} linkStack, *LinkStack;

Statue InitStack(LinkStack *L);
Statue push(LinkStack L, ElemType e);
Statue pull(LinkStack L, ElemType *e);
int isEmpty(LinkStack L);
Statue showStack(LinkStack L);

int main(void)
{

    LinkStack linkStack;
    int i;
    ElemType data;

    // 初始化栈
    InitStack(&linkStack);

    isEmpty(linkStack);

    // 数据入栈
    for (i = 0; i < 6; i++)
    {
        push(linkStack, i);
    }

    showStack(linkStack);

    int count = linkStack->count;
    printf("出栈顺序是:");
    for(i = 0; i < count; i++){
        pull(linkStack, &data);
        printf("%4d", data);
    }
    printf("\n");
    isEmpty(linkStack);
    
    printf("\n\n");

    return 0;
}

/**
 * @description: 判断栈是否为空
 * @param {LinkStack L:栈结构体}
 * @return: EMPTY: 栈为空
 * @return: NOT_EMPTY:栈不为空
 */
int isEmpty(LinkStack L)
{
    /* if(L->top == NULL){
        printf("栈为空\n");
        return EMPTY;
    }else{
        printf("栈为不空\n");
        return NOT_EMPTY;
    } */
    if (L->count == 0)
    {
        printf("栈为空\n");
        return EMPTY;
    }
    else
    {
        printf("栈为不空\n");
        return NOT_EMPTY;
    }
}

/**
 * @description: 为栈分配内存空间, 栈顶指针指向该空间
 * @param {LinkStack L:栈结构体} 
 * @return: SUCCESS: 栈内存分配成功
 */
Statue InitStack(LinkStack *L)
{

    (*L) = (LinkStack)malloc(sizeof(linkStack));
    if ((*L) == NULL)
    {
        printf("栈内存分配错误\n\n");
        exit(ERROR);
    }

    printf("栈内存分配成功\n\n");

    (*L)->top = NULL;
    (*L)->count = 0;

    return SUCCESS;
}

/**
 * @description: 进栈操作
 * @param {LinkStack L: 栈结构体}
 * @param {ElemType e: 待插入的数据}
 * @return: SUCCESS: 入栈成功
 * @return: ERROR: 入栈失败
 */
Statue push(LinkStack L, ElemType e)
{

    // 分配入栈结点内存空间
    LinkStackPtr pushNode = (LinkStackPtr)malloc(sizeof(StackNode));
    // 判断内存是否分配成功
    if (pushNode == NULL)
    {
        printf("入栈结点内存分配失败!\n\n");
        return ERROR;
    }

    // 将结点数据域置为e
    pushNode->data = e;
    // 替换栈顶指针
    pushNode->next = L->top;
    // 修改栈顶指针指向
    L->top = pushNode;

    ++L->count;

    return SUCCESS;
}

/**
 * @description: 出栈操作
 * @param {LinkStack L: 栈结构体} 
 * @param {ElemType *e: 出栈元素存放地址}
 * @return: ERROR: 栈为空
 * @return: SUCCESS: 出栈成功
 */
Statue pull(LinkStack L, ElemType *e)
{

    if(!(L->count)){
        return ERROR;
    }
    LinkStackPtr node = L->top;
    // 获取元素
    *e = node->data;
    // 出栈操作
    L->top = node->next;
    free(node);
    // 栈结点数量减一
    --L->count;

    return SUCCESS;
}

/**
 * @description: 显示栈内所有元素
 * @param {LinkStack L: 栈结构体}
 * @return: EMPTY: 栈为空
 * @return: SUCCESS: 显示完成
 */
Statue showStack(LinkStack L)
{

    LinkStackPtr showNode;

    if (!isEmpty(L))
    {
        return EMPTY;
    }
    showNode = L->top;
    printf("栈内数据为:");

    do
    {
        printf("%4d", showNode->data);
        showNode = showNode->next;
    } while (showNode->next != NULL);

    printf("%4d", showNode->data);

    printf("\n\n");
    return SUCCESS;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值