C语言数据结构篇——栈的顺序存储

2023-10-28

作者名:Demo不是emo 

主页面链接主页传送门
创作初心:对于计算机的学习者来说,初期的学习无疑是最迷茫和难以坚持的,中后期主要是经验和能力的提高,我也刚接触计算机1年,也在不断的探索,在CSDN写博客主要是为了分享自己的学习历程,学习方法,总结的经验等等,希望能帮助到大家
座右铭:不要让时代的悲哀成为你的悲哀
专研方向:网络安全,数据结构

每日emo你要一直做我的月亮,做那个照亮我的人
————————————————

  注:本文需要一定的顺序表基础,有想了解顺序表的小伙伴可以看一下我分享的关于顺序表的博客,点此链接可以直接进入: C语言数据结构篇——顺序表的理解,创建,插入和删除_Grande joie的博客-CSDN博客

目录

前言

初识栈

栈的创建

栈的初始化

判断栈为空 

获取栈顶元素 

弹出栈顶元素 

 压入栈顶元素

销毁栈 

完整代码  

前言

在学完顺序表和链表这两种最基本的数据结构之后就要进入我们的栈和队列的学习了,首先我们来学习栈,而栈的存储方式一样有两种,一种是顺序存储,一种是链式存储,储存结构的不同使实现栈的基本算法也不同,今天我要给大家分享的的就是栈的顺序存储。

初识栈

栈也属于线性表,但是栈是操作受限的线性表,操作受限,就是栈的特点特点之一,在前面线性表的学习中我们知道,链表可以在表的两端甚至任何位置进行插入,删除,等操作,但栈却只能在固定的一端进行操作,意思就是栈的插入,删除等操作都只能在表的一个固定端点上进行,如下图:

如上图,我们可以看到插入,删除等操作只能在一侧进行, 所以向一个栈中插入新元素又称为压栈,入栈;同样的,栈数据的删除又可以称为出栈,弹栈,能够进行压栈,弹栈的一端自称为栈顶,不能的一端称为栈底,下面我们就来看一看应该怎么实现栈的顺序存储;

栈的创建

栈的创建,我们同样以头结点结构体的形式创建栈,头结点的结构体中保存一个数组和一个整型top,如下:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define maxsize 1024//栈的容量(自定义)
#define INFINITY 99999//随便定一个数,待会需要
typedef struct
{
    int data[maxsize];//该数组用来存放栈的数据
    int top;//数组中栈顶元素的下标(即最后一个元素下标)
}seqstack;//定义别名方便使用

这样一个栈就创建好了,下面就可以直接使用了 ;

栈的初始化

我们上面说了头结点中的top代表栈顶元素在数组中的下标 ,所以初始化时就不能把top赋值成自然数,所以我们把top赋值为-1,这样就完成了栈的初始化

void initstack(seqstack* stack)//初始化栈
{
    stack->top=-1;
}

判断栈为空 

判断栈是否为空也很简单,要判断栈为空就判断栈是否为初始状态,而上面我们也进行了栈的初始化,所以栈是否等于-1就可以作为判断栈是否为空的依据,具体代码如下:

int isempty(seqstack* stack)//判断栈为空
{
    if(stack->top==-1)
    {
        return 1;//栈为空
    }
    return 0;//栈不为空
}

获取栈顶元素 

因为我们是用数组来存放栈的数据的,所以要获取栈顶元素,就是获取数组中位于栈顶元素的下标,由上面的结构示意图可以看出来,栈底指的就是数组的第一个元素的位置,栈底指的就是数组最后一个元素,而头结点结构体中的top正是数组中最后一个元素的下标,所以获取栈顶元素是不是也很简单了呢?具体代码如下:

int seqstack_top(seqstack* stack)//获取栈顶元素
{
    if(isempty(stack)==0)//栈不为空
    {
        return stack->data[stack->top];
    }
    return INFINITY;//返回无穷大,不能返回-1,有可能栈的顶端元素就是-1
}

弹出栈顶元素 

弹出栈顶元素就是我们的弹栈,压栈,意思就是弹出栈顶元素,使栈顶元素的后面一个元素成为栈顶元素,对应到数组中的实际操作其实就是删除数组的最后一个元素,所以也是比较简单的,具体代码如下:

int seqstack_pop(seqstack* stack)//弹出栈顶元素
{
    if(isempty(stack)==0)
    {
        return stack->data[stack->top--];
    }
    return INFINITY;//与获取栈顶元素同理
}

 压入栈顶元素

压入栈顶元素就是我们称的压栈,入栈,即吧压入的数据放到栈顶的前面,使之称为新的栈顶,而数组上的意思就是在数组最后一个数据上再加一个数据,具体代码如下:

void seqstack_push(seqstack* stack,int val)//压栈(入栈)
{
    if(stack->top>=maxsize-1)栈已满则无法进行压栈
    {
        return;//退出程序
    }
    stack->top++;//此时栈顶改变,所以top指向新的栈顶下标
    stack->data[stack->top]=val;//入栈
}

销毁栈 

销毁栈就不多说了,直接上代码:

void seqstack_destory(seqstack* stack)
{
    if(isempty(stack)==0)
    {
        free(stack);
    }
}

当然,为了方便使用,我们还可以建立一个遍历打印(即输出)栈的函数,代码如下:

void seqstack_print(seqstack* stack)
{
    for(int i=0;i<=stack->top;i++)
    {
        if(i%5==0)
        {
            printf("\n");
        }
        printf("%d ",stack->data[i]);
    }
    printf("\n");
}

以上就是栈的一些基本操作,我们都以函数的形式封装完了。

完整代码 

下面我们就随便写点数据将这些函数都用起来,就是完整代码啦,代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define maxsize 1024//栈的容量
#define INFINITY 99999//随便定一个数
typedef struct
{
    int data[maxsize];//定义一个数组
    int top;//栈顶元素的下标
}seqstack;
void initstack(seqstack* stack)//初始化栈
{
    stack->top=-1;
}
int isempty(seqstack* stack)//判断栈为空
{
    if(stack->top==-1)
    {
        return 1;//栈为空
    }
    return 0;//栈不为空
}
int seqstack_top(seqstack* stack)//获取栈顶元素
{
    if(isempty(stack)==0)//
    {
        return stack->data[stack->top];
    }
    return INFINITY;//返回无穷大,不能返回-1,有可能栈的顶端元素就是-1
}
int seqstack_pop(seqstack* stack)//弹出栈顶元素
{
    if(isempty(stack)==0)
    {
        return stack->data[stack->top--];
    }
    return INFINITY;
}
void seqstack_push(seqstack* stack,int val)//压栈(入栈)
{
    if(stack->top>=maxsize-1)
    {
        return;//退出程序
    }
    stack->top++;//指向栈顶
    stack->data[stack->top]=val;//入栈
}
void seqstack_destory(seqstack* stack)
{
    if(isempty(stack)==0)
    {
        free(stack);
    }
}
void seqstack_print(seqstack* stack)
{
    for(int i=0;i<=stack->top;i++)
    {
        if(i%5==0)
        {
            printf("\n");
        }
        printf("%d ",stack->data[i]);
    }
    printf("\n");
}
int main()
{
    srand((unsigned)time(0));//以时间为种子获取随机数
    seqstack stack;
    initstack(&stack);
    printf("请输入栈的初始数据个数\n");
    int number;
    scanf("%d",&number);
    for(int i=0;i<number;i++)//将随机数压栈
    {
        seqstack_push(&stack,rand()%1000);
        //rand可以按顺序读取srand通过种子获得的随机数
        //“%1000”是因为我想将随机数的值控制在0到1000
    }
    //获取栈顶元素
    printf("栈顶元素:%d\n",seqstack_top(&stack));
    printf("栈中的元素");
    seqstack_print(&stack);
    seqstack_pop(&stack);//出栈
    printf("出栈后栈中的元素");
    seqstack_print(&stack);
    printf("请输入要压栈的元素\n");
    int input;
    scanf("%d",&input);
    seqstack_push(&stack,input);//入栈
    printf("压栈后栈中的元素");
    seqstack_print(&stack);
    seqstack_destory(&stack);
    return 0;
}

随便写点数据运行一下就是下面这个效果啦

请输入栈的初始数据个数
10
栈顶元素:629
栈中的元素
340 937 63 665 546
729 904 922 326 629
出栈后栈中的元素
340 937 63 665 546
729 904 922 326
请输入要压栈的元素
9999
压栈后栈中的元素
340 937 63 665 546
729 904 922 326 9999

大一学生,c语言学习半年,文章有什么不完善的地方还请见谅,欢迎大家对文章提出自己的看法,最后,感谢大家的阅读。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言数据结构篇——栈的顺序存储 的相关文章

  • C高级DAY4

    作业一 使用shell中的while打印99乘法表 实在没有思路 先写C语言的出来 照着改 bin bash i 1 while i le 9 do j 1 while j le i do num i j echo n i j num j
  • iconify的使用

    如何在vue中使用iconify组件 参考链接 图标 FastCrud 安装依赖 package json dependencies iconify iconify 3 0 1 devDependencies unplugin icons
  • seccomp限制系统调用

    Secure Computing Mode seccomp 是一个内核功能 允许您过滤容器到内核的系统调用 可以向不同的容器传递不同的配置文件 Seccomp提供比功能更精细的控制 使攻击者在容器只能获得有限数量的系统调用 Docker的默
  • 图片服务器定期删除不用的文件,记一次数据库图片引用和服务器文件对比 删除未引用的服务器图片1...

    要保存的文件路径 private void btnSavePath Click objectsender EventArgs e FolderBrowserDialog dialog newFolderBrowserDialog if di
  • canvas rotate() 中心旋转的实际运用

    在开发中遇到了一个问题 在画canvas的时候需要对画布中画出来的特定图片进行中心旋转 直接旋转后图片就转走了 还是需要调整位置 变成中心旋转 平时用到canvas旋转的使用并不多 这个问题卡了好久 最后终于好了 放个dome 需要的可以试

随机推荐

  • CentOS笔记: pyenv 安装 python 多版本(增强版)

    点击打开链接 https www jianshu com p 228cd025a368
  • Windows系统配置Python环境(Anaconda篇)

    Windows系统配置Python环境 Anaconda篇 一 下载 根据自己电脑系统下载对应的安装包 官方下载地址 https www anaconda com products distribution 清华镜像网站 https mir
  • 【Python量化】风险平价策略

    文章目录 一 风险平价策略 二 风险平价组合的构建步骤 第一步 选择底仓 第二步 计算资产对组合的风险贡献 第三步 优化组合风险贡献 计算资产权重 三 风险平价组合的Python实现 3 1 数据概况 3 2 构建风险平价组合 本文章首发于
  • Java集合详解

    文章目录 集合框架的概述 集合框架 Collection接口继承树 List接口框架 Set接口框架 Map接口继承树 Collection接口中的方法的使用 iterator迭代器 集合元素的遍历操作 使用迭代器Iterator接口 测试
  • 架构基础篇

    架构设计的关键思维是判断和取舍 程序设计的关键思维是逻辑和实现 架构设计需要考虑的通用问题 性能 可用性 可扩展性 安全性 成本 规模 架构设计的三大原则 合适优于业界领先 简单优于复杂 迭代优于一步到位 基础概念 架构指软件系统的顶层结构
  • mysql 提交事务_MySQL事务提交过程

    一 MySQL事务提交过程 一 MySQL作为一种关系型数据库 已被广泛应用到互联网中的诸多项目中 今天我们来讨论下事务的提交过程 由于mysql插件式存储架构 导致开启binlog后 事务提交实质是二阶段提交 通过两阶段提交 来保证存储引
  • gcc头文件库文件搜索路径问题

    参考资料 http hi baidu com relayon blog item 95aaf7fcf8e3edf5fc037f89 html 我们编写程序的时候会用到三个东西 头文件 链接时候库文件 运行时动态库文件 对于上面3中 我认为头
  • Linux运维之pacemaker+corosync实现集群管理(负载均衡、配置fence服务)

    前言 高可用集群 是指以减少服务中断 如因服务器宕机等引起的服务中断 时间为目的的服务器集群技术 简单的说 集群就是一组计算机 它们作为一个整体向用户提供一组网络资源 这些单个的计算机系统就是集群的节点 高可用集群的出现是为了减少由计算机硬
  • google jib容器打包工具试用

    简介 Jib 是 Google 开发的可以直接构建 Java 应用的 Docker 和 OCI 镜像的类库 以 Maven 和 Gradle 插件形式提供 通过 Jib Java 开发者可以使用他们熟悉的 Java 工具来构建容器 Jib
  • 20171009离线赛总结

    考试时的思路 第一题 直接枚举 正着循环 倒着循环 求出每个点对应的L和R 第二题 20 32 2017 10 9 看了半天 把所有可能的区间预处理出来 dfs 第三题 30分的话 用二进制枚举 看一条边取还是不取 可以先把链的写了 输入的
  • Cache replacement policies(缓存替换策略)/ LRU 和 LFU等算法

    缓存是一个计算机思维 对于重复的计算 缓存其结果 下次再算这个任务的时候 不去真正的计算 而是直接返回结果 能加快处理速度 当然有些会随时间改变的东西 缓存会失效 得重新计算 在计算中 缓存算法 通常也称为缓存替换算法或缓存替换策略 是优化
  • mPython入门指南--第2课:esptool刷写esp8266固件

    一 材料 1 win10 非ghost版 我的是 2 esp8266带ch340g串口模块 安装好串口驱动 并记下串口号 我的是COM4 二 刷固件过程 1 安装python2 此处敲黑板 只能是python2 因为esptool只支持py
  • Qt中的进度指示器实现——使用QProgressBar生成进度条

    Qt中的进度指示器实现 使用QProgressBar生成进度条 在Qt中 要实现一个进度指示器 Progress Indicator 我们可以使用QProgressBar类来生成一个进度条 QProgressBar是Qt提供的用于显示进度的
  • markdown文字编辑

    markdown字体类html代码简介 1 颜色 2 大小 3 字体 4 背景色 4 居中 颜色 在markdown中采用如下方式能够控制文字的颜色 浅红色文字 font color dd0000 浅红色文字 font br 深红色文字 f
  • 轻松编辑,惊艳构图 —《Pixelmator Pro》小技巧

    Pixelmator Pro的ML Machine Learning 裁剪是一项智能功能 可自动识别和裁剪图像中不需要的部分 使图片更美观 使用这个功能 用户只需要手动选择要保留的重要区域 然后Pixelmator Pro会使用机器学习算术
  • 算法复杂度分析,算法复杂度o(1), o(n), o(logn), o(nlogn) 时间复杂度On和空间复杂度O1是什么意思?

    https www cnblogs com TangBiao p 5856695 html https blog csdn net dazhaoDai article details 81631195 https www cnblogs c
  • BFS 迷宫问题+打印路径

    问题 定义一个二维数组N M 其中2 lt N lt 10 2 lt M lt 10 如5 5数组下所示 int maze 5 5 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 它表示一
  • pycharm无限制更新码

    http www lookdiv com 密码7788
  • SPI通讯的数据交互及图片显示

    这个项目耗时三个月 前两个月攻克技术难关 后一个月进行功能联调 也是我很长时间没有更新的原因 一个项目从初期的evt到最终的pvt 离不开大家的合作 从前期的prd核对到最终的项目交付 耗费了我大量心血 期间遇到的问题不计其数 所以说一个好
  • C语言数据结构篇——栈的顺序存储

    作者名 Demo不是emo 主页面链接 主页传送门创作初心 对于计算机的学习者来说 初期的学习无疑是最迷茫和难以坚持的 中后期主要是经验和能力的提高 我也刚接触计算机1年 也在不断的探索 在CSDN写博客主要是为了分享自己的学习历程 学习方