【数据结构】链栈

本文介绍了如何使用C语言实现链栈的数据结构,包括初始化、销毁、清空栈、检查栈是否为空、返回栈的长度、返回栈顶元素、压栈、弹栈以及打印栈中所有元素等基本操作。提供了完整的源代码和主函数示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

⭐️写在前面的话⭐️

📒博客主页: 程序员好冰
🎉欢迎 【点赞👍 关注🔎 收藏⭐️ 留言📝】
📌本文由 程序员好冰 原创,优快云 首发!
📆入站时间: 🌴2022 年 07 月 13 日🌴
✉️ 是非不入松风耳,花落花开只读书。
💭推荐书籍:📚《Java编程思想》,📚《Java 核心技术卷》
💬参考在线编程网站:🌐牛客网🌐力扣
🍭 作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!🍭


链栈的实现

初始化

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

#define OK 1
#define ERROR -1

typedef int Status;
typedef int ElemType;

//定义每个结点的结构体
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode;

//定义整条链栈的结构体
typedef struct LinkStack
{
    int count;
    LNode *top;
}LinkStack;

Status InitStack(LinkStack*);
Status DestoryStack(LinkStack*);
Status ClearStack(LinkStack*);
Status StackIsEmpty(LinkStack);
Status StackLength(LinkStack);
Status GetTop(LinkStack);
Status Push(LinkStack*,ElemType);
Status Pop(LinkStack*);
Status PrintStack(LinkStack);

1、初始化栈

//1、初始化链栈
Status InitStack(LinkStack *L)
{
    L->top=(LNode*)malloc(sizeof(LNode));
    if(!L->top){
        printf("空间分配失败,请重新操作.\n");
        return ERROR;
    }
    L->top=NULL;
    L->count=0;
    printf("栈初始化成功.\n");
    return OK;
}

2、销毁栈

//2、销毁栈
Status DestoryStack(LinkStack *L)
{
    ClearStack(L);
    free(L);
    return OK;
}

3、清空栈

//3、清空栈
Status ClearStack(LinkStack *L)
{
    LNode *temp;
    while(!L->top){
        temp=L->top;
        L->top=L->top->next;
        free(temp);
    }
    L->count=0;
    printf("清空栈成功.\n");
    return OK;
}

4、检查栈是否为空

//4、检查栈是否为空
Status StackIsEmpty(LinkStack L)
{
    if(L.count==0){
        printf("当前栈为空.\n");
        return OK;
    }
    printf("当前栈不为空.\n");
    return OK;
}

5、返回栈的长度

//5、返回栈的长度
Status StackLength(LinkStack L)
{
    printf("当前栈的长度为%d.\n",L.count);
    return OK;
}

6、返回栈顶元素

//6、返回栈顶元素
Status GetTop(LinkStack L)
{
    if(L.count==0){
        printf("栈空,请压栈后再操作.\n");
        return ERROR;
    }
    printf("栈顶元素为:%d.\n",L.top->data);
    return OK;
}

7、压栈

//7、压栈
Status Push(LinkStack *L,ElemType e)
{
    LNode *s = (LNode*)malloc(sizeof(LNode));
    s->data=e;
    s->next=L->top;
    L->top=s;
    L->count++;
    printf("元素%d被压入.\n",e);
    PrintStack(*L);
    return OK;
}

8、弹栈

//8、出栈
Status Pop(LinkStack *L)
{
    if(L->count==0){
        printf("栈空,请压栈后再操作.\n");
        return ERROR;
    }
    printf("元素%d被弹出.\n",L->top->data);
    LNode *temp;
    temp=L->top;
    L->top=L->top->next;
    free(temp);
    L->count--;
    PrintStack(*L);
    return OK;
}

9、打印栈中所有元素

//9、打印栈中所有元素
Status PrintStack(LinkStack L)
{
    if(L.count==0){
        printf("栈空,请压栈后再操作.\n");
        return ERROR;
    }
    printf("栈为:");
    while(L.top){
        printf("%d  ",L.top->data);
        L.top=L.top->next;
    }
    return OK;
}

主函数

int main()
{
    LinkStack L;
    printf("请继续操作...\n");
    while(1){
        int input;
        int value;
        printf("\n==========================\n");
        printf("1、初始化链栈.\n");
        printf("2、销毁栈.\n");
        printf("3、清空栈.\n");
        printf("4、检查栈是否为空.\n");
        printf("5、返回栈的长度.\n");
        printf("6、返回栈顶元素.\n");
        printf("7、压栈.\n");
        printf("8、弹栈.\n");
        printf("9、打印栈中所有元素.\n");
        printf("\n==========================\n");
        printf("请输入对应操作的序号:");
        scanf("%d",&input);
        switch(input){
        case 1:
            InitStack(&L);
            break;
        case 2:
            DestoryStack(&L);
            break;
        case 3:
            ClearStack(&L);
            break;
        case 4:
            StackIsEmpty(L);
            break;
        case 5:
            StackLength(L);
            break;
        case 6:
            GetTop(L);
            break;
        case 7:
            printf("请输入需要压入的元素:");
            scanf("%d",&value);
            Push(&L,value);
            break;
        case 8:
            Pop(&L);
            break;
        case 9:
            PrintStack(L);
            break;
        }
    }
    return 0;
}

程序源码

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

#define OK 1
#define ERROR -1

typedef int Status;
typedef int ElemType;

//定义每个结点的结构体
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode;

//定义整条链栈的结构体
typedef struct LinkStack
{
    int count;
    LNode *top;
}LinkStack;

Status InitStack(LinkStack*);
Status DestoryStack(LinkStack*);
Status ClearStack(LinkStack*);
Status StackIsEmpty(LinkStack);
Status StackLength(LinkStack);
Status GetTop(LinkStack);
Status Push(LinkStack*,ElemType);
Status Pop(LinkStack*);
Status PrintStack(LinkStack);

//1、初始化链栈
Status InitStack(LinkStack *L)
{
    L->top=(LNode*)malloc(sizeof(LNode));
    if(!L->top){
        printf("空间分配失败,请重新操作.\n");
        return ERROR;
    }
    L->top=NULL;
    L->count=0;
    printf("栈初始化成功.\n");
    return OK;
}

//2、销毁栈
Status DestoryStack(LinkStack *L)
{
    ClearStack(L);
    free(L);
    return OK;
}

//3、清空栈
Status ClearStack(LinkStack *L)
{
    LNode *temp;
    while(!L->top){
        temp=L->top;
        L->top=L->top->next;
        free(temp);
    }
    L->count=0;
    printf("清空栈成功.\n");
    return OK;
}

//4、检查栈是否为空
Status StackIsEmpty(LinkStack L)
{
    if(L.count==0){
        printf("当前栈为空.\n");
        return OK;
    }
    printf("当前栈不为空.\n");
    return OK;
}

//5、返回栈的长度
Status StackLength(LinkStack L)
{
    printf("当前栈的长度为%d.\n",L.count);
    return OK;
}

//6、返回栈顶元素
Status GetTop(LinkStack L)
{
    if(L.count==0){
        printf("栈空,请压栈后再操作.\n");
        return ERROR;
    }
    printf("栈顶元素为:%d.\n",L.top->data);
    return OK;
}

//7、压栈
Status Push(LinkStack *L,ElemType e)
{
    LNode *s = (LNode*)malloc(sizeof(LNode));
    s->data=e;
    s->next=L->top;
    L->top=s;
    L->count++;
    printf("元素%d被压入.\n",e);
    PrintStack(*L);
    return OK;
}

//8、出栈
Status Pop(LinkStack *L)
{
    if(L->count==0){
        printf("栈空,请压栈后再操作.\n");
        return ERROR;
    }
    printf("元素%d被弹出.\n",L->top->data);
    LNode *temp;
    temp=L->top;
    L->top=L->top->next;
    free(temp);
    L->count--;
    PrintStack(*L);
    return OK;
}

//9、打印栈中所有元素
Status PrintStack(LinkStack L)
{
    if(L.count==0){
        printf("栈空,请压栈后再操作.\n");
        return ERROR;
    }
    printf("栈为:");
    while(L.top){
        printf("%d  ",L.top->data);
        L.top=L.top->next;
    }
    return OK;
}


int main()
{
    LinkStack L;
    printf("请继续操作...\n");
    while(1){
        int input;
        int value;
        printf("\n==========================\n");
        printf("1、初始化链栈.\n");
        printf("2、销毁栈.\n");
        printf("3、清空栈.\n");
        printf("4、检查栈是否为空.\n");
        printf("5、返回栈的长度.\n");
        printf("6、返回栈顶元素.\n");
        printf("7、压栈.\n");
        printf("8、弹栈.\n");
        printf("9、打印栈中所有元素.\n");
        printf("\n==========================\n");
        printf("请输入对应操作的序号:");
        scanf("%d",&input);
        switch(input){
        case 1:
            InitStack(&L);
            break;
        case 2:
            DestoryStack(&L);
            break;
        case 3:
            ClearStack(&L);
            break;
        case 4:
            StackIsEmpty(L);
            break;
        case 5:
            StackLength(L);
            break;
        case 6:
            GetTop(L);
            break;
        case 7:
            printf("请输入需要压入的元素:");
            scanf("%d",&value);
            Push(&L,value);
            break;
        case 8:
            Pop(&L);
            break;
        case 9:
            PrintStack(L);
            break;
        }
    }
    return 0;
}
运行截图

image-20230331023256087


🚀先看后赞,养成习惯!🚀

🚀 先看后赞,养成习惯!🚀

🎈觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!🎈


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值