链栈的实现

本文介绍了链栈的实现,包括结构体定义、初始化、入栈、出栈、判断栈空、显示数据和获取元素数量等操作。程序采用头结点,并通过头部插入和删除节点实现栈的功能。在主函数中提供了用户交互界面,允许进行各种栈操作。

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


(栈具有先进后出的特点,只能在栈顶进行数据操作(入栈和出栈只能在栈顶进行))
1、本程序带有头结点
2、当有新结点入栈从头部插入数据
3、当需要删除结点时也从头部删除

结构体:

#include <stdio.h>
#include <windows.h>

typedef struct Stack
{
    int val;            //存储数据
    struct Stack *Next; //指向下一结点
    int nums;         //元素数量
}Stack_Node;

栈的相关操作:

Stack_Node *InitStack();                //初始化链栈
void Push(Stack_Node *stack,int val);   //入栈操作
int Pop(Stack_Node *stack);             //出栈操作
boolean isEmpty(Stack_Node *stack);     //判断栈是否为空
void show(Stack_Node *stack);           //显示栈中数据元素
int GetNums(Stack_Node *stack);          //获取栈中元素数量

主函数:

#include "stack.h"

void main()
{
    Stack_Node *stack;
    stack = InitStack();
    int val ;       //保存入栈数据
    int opt = 1;    //操作选择
    while(opt)
    {
        printf("----------------------------------\n");
        printf("1、入栈操作          2、出栈操作    \n");
        printf("3、显示数据          4、获取元素数量\n");
        printf("5、退出                           \n");
        printf("----------------------------------\n");
        printf("请输入操作代号:");
        scanf("%d",&opt);
        switch(opt)
        {
            case 1:
                printf("请输入入栈数据:\n");
                scanf("%d",&val);
                Push(stack,val);
                break;
            case 2:
                printf("数据出栈:\n");
                int data = Pop(stack);
                printf("出栈数据为:\t%d\n",data);
                break;
            case 3:
                printf("显示数据:\n");
                show(stack);
                break;
            case 4:
                printf("获取元素数量为:\n");
                int num = GetNums(stack);
                printf("元素数量为:\t%d\n",num);
                break;
            case 5:
                printf("退出系统\n");
                opt = 0;
                exit(-1);
            default:
                printf("输入有误,请重新输入1~5之间的数字\n");
                break ;
        }
    }
    system("pause");
    return ;
}

初始化链栈:

Stack_Node *InitStack()
{
    Stack_Node *node = (Stack_Node *)malloc(sizeof(Stack_Node));
    if(node == NULL)
    {
        printf("内存申请失败...\n");
        exit(-1);
    }
    node->val = 0;
    node->Next = NULL;
    node->nums = 0;
    return node;
}

入栈操作:

void Push(Stack_Node *stack,int val)
{
    //采用头部入栈的方法
    Stack_Node *tmp = (Stack_Node *)malloc(sizeof(Stack_Node)); //申请新的结点空间
    if(tmp == NULL)
    {
        printf("内存申请失败");
        return ;
    }
    tmp->val = val;             //保存传入的数据
    tmp->Next = stack->Next;    //新结点指向头结点指向的下一元素
    stack->Next = tmp;          //头结点指向新结点
    stack->nums ++;             //元素数量加 1
}

在这里插入图片描述

出栈操作:

int Pop(Stack_Node *stack)
{
    //判断栈中是否有结点存在
    if(isEmpty(stack))
    {
        printf("栈为空\n");
        return -1;
    }    
    Stack_Node* delete = stack->Next;       //辅助结点栈顶结点
    int del_data = delete->val;             //获取栈顶结点的数据
    stack->Next = delete->Next;             //头结点指向栈顶元素的下一结点
    stack->nums --;                         //栈中元素数量减 1
    free(delete);                           //释放结点空间
    return del_data;    
}

在这里插入图片描述

判断栈是否为空:

oolean isEmpty(Stack_Node *stack)
{
    //栈中元素数量为 0 或者头结点指向为空时栈为空
    if(stack->nums == 0 || stack->Next == NULL)
        return TRUE;
    return FALSE;
}

输出栈中数据:

void show(Stack_Node *stack)
{
    Stack_Node *node = stack->Next;
    while(node)
    {
        printf("栈中元素为:%d\t\n",node->val);
        node =  node->Next;
    }
}

在这里插入图片描述

获取元素数量:

int GetNums(Stack_Node *stack)
{
    return stack->nums;
}

在这里插入图片描述

说明:此文章为学习笔记,如有侵权联系删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Byte_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值