C语言栈的简单实现(两种方法)

文章介绍了栈这一数据结构的基本概念,强调其先进后出(FILO)的特性,并通过C语言代码展示了栈的两种实现方式:顺序存储和链表存储。顺序存储中,使用了动态内存分配和初始化函数;链表存储则利用头插法进行操作。文章提供了输入、输出和检查栈状态的函数示例,帮助读者理解栈的操作过程。
摘要由CSDN通过智能技术生成

栈 是一个容器,存到里面的数据是有顺序性的

例如我要存有顺序的 1 2 3 

可以是一下几种

1.进 1 ,出 1 ,进 2, 出 2 ,进 3, 出 3  结果1 2 3

2.进 1 ,进 2 ,出 2,进3,出3,出1   结果2 3 1

3.进1 ,进2,进3,出3,出2,出1 结果3 2 1

4.进1 ,出1,进2,进3,出3,出2 结果 1 3 2

1只能是最先进去的,3值能使最后进去的

就是因为在读入的时候它们是由顺序的,在栈中不能改变顺序。

它就像一个杯子,最后放在里面的弹珠,总会第一个出来。(先进后出,后进先出)

下面是普通的栈空间的运用:
#include <stdio.h>
#include <malloc.h>
typedef struct track  这个栈只能存整形的值 这里自定义栈类型
{
    int *value;       有一个整形的值指针
    int size;         长度
    int top;          下标
}Track;

void init(Track *track,int size)  初始化栈空间
{
    track->size = size;
    track->top = -1;              如果这个赋值为0的话,最后会多输出一个地址(博主也不知道为什么)
    track->value = (int*)malloc(size * sizeof(int)); 数据是要空间才能存放
}

int input_value(Track *track , int value)  传入数值
{
    if(track->size == 0)      预判这个栈空间是否为空
        return 0;
    track->top++;             下标从0开始
    track->value[track->top] = value;  赋值
    return 1;
}

int output_value(Track *track) 输出数值
{
    if(track->top == -1) 预判这个最后的下标指向的栈空间是否存在
        return 0;
    int value = track->value[track->top]; 用一个变量存放要输出的值
    track->top--;  
    return value;
}

int back_top(Track *track) 回到栈顶的值
{
    if(track->top == -1) 预判栈顶的值的下标是否存在
        return 0;
    int value = track->value[track->top]; 
    return value;
}

int Isempty(Track *track)  设定空栈的标志
{
    return track->top == -1; 
}

int Isfull(Track *track) 满栈的标志
{
    return track->top == track->size;
}

int main()
{
    Track track;    
    init(&track,5); 
    input_value(&track,1);
    input_value(&track,12);
    input_value(&track,123);
    input_value(&track,1234);
    while(!Isempty(&track))
    {
        printf("%5d",output_value(&track));
    }
    return 0;   
}


下面是在链表中栈的运用:

#include <stdio.h>
#include <malloc.h>
typedef struct LIST
{
    int value;
    struct LIST *next; 实现链表
}list_point;

typedef struct track
{
    list_point *point; 实现栈头  栈头指向链表
}Link_point;

void init(Link_point *track) 初始化栈
{
    track->point = NULL;
}

int input_value(Link_point *track,int value) 读入数值
{
    list_point *p = (list_point *)malloc(sizeof(list_point));
    值在链表中实现,就要向系统申请链表的空间
    p->value = value;
    p->next = track->point; 这里类似头指针  运用的是头插法 
    track->point = p;
    return 1;
}

int output_value(Link_point *track) 输出数值
{
    list_point *p = track->point;   
    int value = p->value;  
    track->point = p->next; 
    free(p);
    把栈头赋给链表头,由链表头输出栈头所指向的值
    然后栈头指向链表头(栈头)后面的节点
    最后free掉原来的栈头
    return value;
}

int Isempty(Link_point *track) 设定空栈的标志
{
    return track->point == NULL;
}

int main()
{
    Link_point track;
    init(&track);
    input_value(&track,1);
    input_value(&track,12);
    input_value(&track,123);
    input_value(&track,1234);
    while(!Isempty(&track))
    {
        printf("%5d",output_value(&track));
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值