linux学习:栈

目录

顺序栈

结构

初始化一个空顺序栈

压栈

出栈

例子 十进制转八进制

链式栈

管理结构体的定义

初始化

压栈

出栈


顺序栈

顺序栈的实现,主要就是定义一块连续的内存来存放这些栈元素,同时为了方便管理, 再定义一个整数变量来代表当前栈顶元素在此连续内存中的偏移量,这样就可以很方便地知 道栈的状态和当前栈顶元素的位置,便于压栈和出栈操作。将栈内存地址和栈顶元素偏移量 放在一起,形成一个专门用来管理顺序栈的结构体,我们称之为管理结构体

结构

struct sequent_stack // 栈的管理结构体
{
    int *stack; // 用 stack 指向一块连续的内存来存储栈元素
    int size; // size 保存了该顺序栈的总大小
    int top; // 用 top 来指示栈顶元素的偏移量
};

初始化一个空顺序栈

一个空栈意味着栈中 没有元素,首先将 stack 指向的内存清零,其次更重要的是将 top 置为-1,同时规定-1 为 空栈的标志,这么做的好处是:将来压栈第一个元素之后,立即将 top 加 1 就会得到 0, 而第一个元素就放在 stack 所指向的内存的开端处,偏移量刚好为 0

struct sequent_stack *init_stack(int size) // 参数 size 表明空栈的初始大小
{
    struct sequent_stack *s;
    s = malloc(sizeof(struct seqent_stack)); // 申请栈管理结构体
    if(s != NULL)
    {
        s->stack = calloc(size, sizeof(int)); // 申请栈空间,并由 stack 指向
        s->size = size;
        s->top = -1; // 将栈顶偏移量置为-1,代表空栈
    }
    return s;
}

压栈

假设栈中已有一些元素,压栈的第一步首先要判 断栈是否已满,如果已满就要考虑扩充栈空间或者直接出错返回,如果未满,则需要将新的 栈顶元素堆叠到原栈顶之上

bool stack_full(struct sequent_stack *s)
{
    return s->top >= s->size-1; // 判断栈是否已满
}
bool push(struct sequent_stack *s, int data)
{
    if(stack_full(s)) // 如果栈已满,则出错返回
        return false;
    s->top++;
    s->stack[s->top] = data;
    return true;
}

出栈

出栈之前,需要判断栈是否为空

bool stack_empty(struct sequent_stack *s)
{
    return s->top == -1; // 判断栈是否为空
}
bool pop(struct sequent_stack *s, int *p) // p 指向存放栈顶元素的内存
{
    if(stack_empty(s)) // 如果栈为空,则出错返回
        return false;
    *p = s->stack[s->top];
    s->top--;
    return true;
}

例子 十进制转八进制

int main(void)
{
    struct sequent_stack *s;
    s = init_stack(10); // 初始化一个具有 10 个元素空间的顺序栈
    int n;
    scanf("%d", &n); // 让用户输入一个需要转换的十进制数
    while(n > 0)
    {
        push(s, n%8); // 使用短除法将余数统统压栈
        n /= 8;
    }
    int m;
    while(!stack_empty(s)) // 只要栈不为空,就继续循环
    {
        pop(s, &m); // 出栈并打印出来
        printf("%d", m);
    }
    printf("\n");
    return 0;
}

链式栈

对于链式栈而言,同样也需要一系列基本操作:初始化、压栈、出栈、判断是否为空、 判断是否已满等等。首先,初始化一个空栈,意味着使得 top 指向 NULL,而 size 记为 0

管理结构体的定义

struct node // 栈节点结构体
{
    int data;
    struct node *next;
};
struct linked_stack // 栈管理结构体
{
    struct node *top;
    int size;
};

初始化

struct linked_stack *init_stack(void)
{
    struct linked_stack *s;
    s = malloc(sizeof(struct linked_stack)); // 申请一个管理结构体
    if(s != NULL)
    {
        s->top = NULL; // j 将栈置空
        s->size = 0;
    }
    return s;
}

压栈

压栈首先需要一个新节点,然后 将新的节点的 next 指针指向原来的栈顶,再让 top 指针指向该新的栈顶元素即可

创建新结点

struct node *new_node(int data) // 创建一个新的节点
{
    struct node *new;
    new = malloc(sizeof(struct node));
    if(new != NULL)
    {
        new->data = data;
        new->next = NULL;
    }
    return new;
}

将新节点 new 压栈

bool push(struct linked_stack *s, struct node *new) // 将新节点 new 压栈
{
    if(s == NULL || new == NULL)
        return false;
    new->next = s->top; // 第①步(见上图)
    s->top = new; // 第②步
    s->size++;
    return true;
}

出栈

对于出栈来说,首先要判断栈是否为空,如果不为空,则先要用一个指针 tmp 来保存 原栈顶元素的地址,然后返回栈顶元素,再将 top 指针指向下一个元素,最后要注意释放 tmp 所指向的原栈顶元素的内存空间

bool pop(struct linked_stack *s, int *p)
{
    if(s == NULL || p == NULL || stack_empty(s))
        return false;
    struct node *tmp = s->top; // 第①步
    *p = tmp->data; // 第②步
    s->top = s->top->next; // 第③步
    free(tmp); // 第④步
    s->size--;
    return true;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/535778.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机基础知识-第9章-存储的本质(2)——硬盘和文件系统基础知识

一、机械硬盘的原理 概括来说,硬盘的工作原理是利用特定的磁粒子的极性来记录数据。磁头在读取数据时,将磁力子的不同极性转换成不同的电脉冲信号,再利用数据转换器将这些原始信号变成电脑可以使用的数据,写的操作正好与此相反。…

前端docker jenkins nginx CI/CD持续集成持续部署-实战

最近用go react ts开发了一个todolist后端基本开发完了,前端采用CI/CD方式去部署。 步骤总结 先安装docker 和 docker-compose。安装jenkins镜像,跑容器的时候要配好数据卷。配置gitee或github(我这里使用gitee)在服务器上一定要创建好dokcer的数据卷,以便持久保存jenkin…

Transformer模型-decoder解码器,target mask目标掩码的简明介绍

今天介绍transformer模型的decoder解码器,target mask目标掩码 背景 解码器层是对前面文章中提到的子层的包装器。它接受位置嵌入的目标序列,并将它们通过带掩码的多头注意力机制传递。使用掩码是为了防止解码器查看序列中的下一个标记。它迫使模型仅使用…

pytorch实现胶囊网络(capsulenet)

胶囊网络在hinton刚提出来的时候小热过一段时间,之后热度并没有维持多久。vision transformer之后基本少有人问津了。不过这个模型思路挺独特的,值得研究一下。 这个模型的提出是为了解决CNN模型学习到的特征之间没有空间上的关系,从而对于各…

Sketch3D:用于草图到3D生成的样式一致性指南

Sketch3D: Style-Consistent Guidance for Sketch-to-3D Generation Sketch3D:用于草图到3D生成的样式一致性指南 Wangguandong Zheng 重试 错误原因 Southeast UniversityChina 重试 错误原因 wgdzhengseu.edu.cnHaifeng Xia 重试 错误原因 Southeast Universit…

CSS - 盒子模型、图片模糊、过渡效果、2D图移动、放大缩小、CSS动画、flex布局

盒子模型 CSS盒子模型是指在网页布局中,每个元素都被看作是一个矩形的盒子,这个盒子由内容区域、内边距、边框和外边距组成。盒子模型在CSS中用于确定元素在页面中的尺寸、位置和边距。 盒子模型由以下几个部分组成: 内容区域(…

行云堡垒国密算法应用与信创支持

一、 国密算法和信创的介绍 1.1 什么是国密算法 国密算法是国家密码管理局制定颁布的一系列的密码标准,即已经被国家密码局认定的国产密码算法,又称商用密码(是指能够实现商用密码算法的加密,解密和认证等功能的技术)…

Qlik Sense : Crosstable在数据加载脚本中使用交叉表

什么是Crosstable? 交叉表是常见的表格类型,特点是在两个标题数据正交列表之间显示值矩阵。如果要将数据关联到其他数据表格,交叉表通常不是最佳数据格式。 本主题介绍了如何逆透视交叉表,即,在数据加载脚本中使用 L…

批归一化(BN)在神经网络中的作用与原理

文章目录 1. 批归一化(BN)在神经网络中的作用与原理1.1 作用与优势1.2 原理与推导 2. 将BN应用于神经网络的方法2.1 训练时的BN 2. 将BN应用于神经网络的方法2.1 训练时的BN2.2 测试时的BN代码示例(Python): 3. BN的优…

机器学习-09-图像处理01-理论

总结 本系列是机器学习课程的系列课程,主要介绍机器学习中图像处理技术。 参考 02图像知识 色彩基础知识整理-色相、饱和度、明度、色调 图像特征提取(VGG和Resnet特征提取卷积过程详解) Python图像处理入门 【人工智能】PythonOpenCV…

基于python的天气数据可视化系统、Flask框架,爬虫采集天气数据,可视化分析

系统介绍 基于Python的天气预测可视化分析系统,该项目的主要流程和功能包括: 数据获取: 使用Python的pandas库从2345天气网(http://tianqi.2345.com/Pc/GetHistory)抓取山东省各市区县在2021年至2023年间的天气历史数…

【方法】PDF密码如何取消?

对于重要的PDF文件,很多人会设置密码保护,那后续不需要保护了,如何取消密码呢? 今天我们来看看,PDF的两种密码,即“限制密码”和“打开密码”,是如何取消的,以及忘记密码的情况要怎…

文献学习-33-一个用于生成手术视频摘要的python库

VideoSum: A Python Library for Surgical Video Summarization Authors: Luis C. Garcia-Peraza-Herrera, Sebastien Ourselin, and Tom Vercauteren Source: https://arxiv.org/pdf/2303.10173.pdf 这篇文章主要关注的是如何通过视频摘要来简化和可视化手术视频&#xff0c…

计算机基础知识-第4章-真值表和逻辑运算、位运算

一、真值表与逻辑运算 真值表 真值表是什么呢?我们来看百度百科的定义。表征逻辑事件输入和输出之间全部可能状态的表格。列出命题公式真假值的表。通常以1表示真,0 表示假。命题公式的取值由组成命题公式的命题变元的取值和命题联结词决定,…

开源监控zabbix对接可视化工具grafana教程

今天要给大家介绍的是开源监控工具zabbix对接可视化工具grafana问题。 有一定运维经验的小伙伴大抵都或多或少使用过、至少也听说过开源监控工具zabbix,更进一步的小伙伴可能知道zabbix在数据呈现方面有着明显的短板,因此需要搭配使用第三方的可视化工具…

Qlik Sense :use Peek function to Group by and Get Rowno

Question Row number based on groups of data Calculate row number for groups 有时候我们需要基于分组来对数据进行内部排序,例如一个iddate,把不同的属性的记录标记为123,又或者把重复记录标记出来 Solved: Calculate row number for…

MacOS安装openMP报错【已解决】

error: Target “WLBG” links to: OpenMP::OpenMP_CXX but the target was not found. Possible reasons include: * There is a typo in the target name. * A find_package call is missing for an IMPORTED target. * An ALIAS target is missing. 最开始是报这个错&#x…

云上配置Hadoop环境

Hadoop概述 Hadoop技术主要是由下面这三个组件组合而成的: HDFS是一个典型的主从模式架构。 HDFS的基础架构 HDFS的集群搭建 一点准备工作 其实这一块没啥内容,就是将Hadoop官网下载下来的Hadoop的tar包上传到我们服务器上的文件目录下: …

2024考研调剂须知

----------------------------------------------------------------------------------------------------- 考研复试科研背景提升班 教你快速深入了解掌握考研复试面试中的常见问题以及注意事项,系统的教你如何在短期内快速提升自己的专业知识水平和编程以及英语…

Vue ElementUI el-input-number 改变控制按钮 icon 箭头为三角形

el-input-number 属性 controls-position 值为 right 时&#xff1b; <el-input-number v-model"num" controls-position"right" :min"1" :max"10"></el-input-number>原生效果 修改后效果 CSS 修改 .el-input-number…