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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DP例题详解(二)最短编辑距离和编辑距离

902. 最短编辑距离 - AcWing题库 #include<bits/stdc.h>using namespace std;const int N1010;int n,m; char a[N],b[N]; int f[N][N];int main() {cin>>n>>a1;cin>>m>>b1;for(int i0;i<m;i)f[0][i]i;for(int i0;i<n;i)f[i][0]i;//先初始化…

今天讲讲MYSQL数据库事务怎么实现的!

目录 什么是数据库事务 Mysql如何保证原子性 Mysql如何保证持久性 MySQL怎么保证隔离性 事务隔离级别 脏读的解决 不可重复读的解决 幻读的解决 MVCC实现 Read View 那么RC、RR级别下的InnoDB快照读有什么不同&#xff1f; 什么是数据库事务 数据库事务是指一组数据…

FPGA - 以太网UDP通信(二)

一&#xff0c;引言 前文链接&#xff1a;FPGA - 以太网UDP通信&#xff08;一&#xff09; 在上文章中介绍了以太网简介&#xff0c;以太网UDP通信硬件结构&#xff0c;以及PHY芯片RGMII接口-GMII接口转换逻辑&#xff0c;接下来介绍UDP通信结构框图以及数据链路层&#xff…

全面学习SpringCloud框架指南

要深入学习Spring Cloud框架,你需要系统地掌握其核心组件和概念,并了解如何在实际项目中应用这些知识。以下是一些关键的学习点和相应的学习内容: 一共分为10个模块包括: 1、微服务架构基础: 理解微服务架构的概念和优势。 学习单体架构向微服务架构演进的过程。 掌握…

逆向案例二十一——遇到混淆怎么办

开始新的板块尝试&#xff0c;混淆了怎么办 网址&#xff1a;极简壁纸_海量电脑桌面壁纸美图_4K超高清_最潮壁纸网站 抓包抓到&#xff0c;好久没做解密了&#xff0c;奥里给干他&#xff01;&#xff1a; 搜索关键字&#xff0c;打上断点&#xff0c;点击第二页。 _0x10a345…

网工内推 | 网安、AGV测试网络工程师,厂商认证优先,应届可投

01 神州数码 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、负责国内外主流安全产品&#xff08;如防火墙、入侵防御、WAF、安全审计等&#xff09;的上线安装、调试、测试、割接、运维等工作。 2、能够独立进行安全类项目实施、问题排查及处理。 3、在出现网络攻…

数据分析——数据规范化

数据规范化是数据分析中的一个重要步骤&#xff0c;其目的在于确保数据的一致性和可比性&#xff0c;提高数据质量和分析结果的准确性。以下是一些数据规范化的常见方法和技术&#xff1a; 数据清洗&#xff1a;此步骤主要清除数据中的重复项、空格、格式错误等&#xff0c;确…

史上首位阿贝尔奖、图灵奖双得主!2023图灵奖授予随机性大佬Avi Wigderson

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 这位多产的研究者发现了随机性和计算之间的深刻联系&#xff0c;其贡献影响了密码学、复杂性…

二叉树练习day.7

530.二叉搜索树的最小绝对差 链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 示例 1&…

【简明图文教程】Node.js的下载、安装、环境配置及测试

文章目录 前言下载Node.js安装Node.js配置Node.js配置环境变量测试后言 前言 本教程适用于小白第一次从零开始进行Node.js的下载、安装、环境配置及测试。 如果你之前已经安装过了Node.js或删除掉了Node.js想重新安装&#xff0c;需要先参考以下博客进行处理后&#xff0c;再根…

Harmony鸿蒙南向驱动开发-MIPI DSI接口使用

功能简介 DSI&#xff08;Display Serial Interface&#xff09;是由移动行业处理器接口联盟&#xff08;Mobile Industry Processor Interface (MIPI) Alliance&#xff09;制定的规范&#xff0c;旨在降低移动设备中显示控制器的成本。它以串行的方式发送像素数据或指令给外…

基于SpringBoot+vue网上点餐系统包含万字文档

基于SpringBoot的网上点餐系统包含万字文档 项目视频演示: springboot027网上点餐系统包含万字文档 开发系统:Windows 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要…