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.mzph.cn/news/808697.shtml

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

相关文章

2024中国(宁波)国际宠物用品博览会

2024中国(宁波)国际宠物用品博览会 People&Pet Fair 2024 专注2B交易,关注人宠发展,它经济,势不可挡! 时间:2024年11月14-16日 地点:宁波国际会展中心 详询主办方陆先生 I38(前三位) …

水离子雾化壁炉与酒店大厅的氛围搭配

将水离子雾化壁炉与酒店大厅的氛围搭配是一个很好的主意,可以为大厅增添舒适、温馨的氛围,以下是一些建议: 迎宾区域:在酒店大厅的迎宾区域设置水离子雾化壁炉,作为客人抵达时的第一印象。壁炉的温馨效果可以让客人感到…

Java+BS +saas云HIS系统源码SpringBoot+itext + POI + ureport2数字化医院系统源码

JavaBS saas云HIS系统源码SpringBootitext POI ureport2数字化医院系统源码 医院云HIS系统是一种运用云计算、大数据、物联网等新兴信息技术的业务和技术平台。它按照现代医疗卫生管理要求,在特定区域内以数字化形式收集、存储、传递和处理医疗卫生行业的数据。通…

【应用】SpringBoot-自动配置原理

前言 本文简要介绍SpringBoot的自动配置原理。 本文讲述的SpringBoot版本为:3.1.2。 前置知识 在看原理介绍之前,需要知道Import注解的作用: 可以导入Configuration注解的配置类、声明Bean注解的bean方法;可以导入ImportSele…

前置递增和后置递增

前置递增 先让变量1&#xff0c;然后进行表达式运算 int a2 10;int b2 a2 *10;cout<<"a2"<<a2<<endl;cout<<"b2"<<b2<<endl;运行结果&#xff1a;a211 b2110 后置递增 后置递增&#xff0c;先进行表达式运算&…

Python pathlib中Path用法

Python pathlib中Path用法 文章目录 Python pathlib中Path用法 Path类是Python中 pathlib模块的主要组成部分之一&#xff0c;它提供了一种面向对象的方式来处理文件系统路径。 Path对象可以表示文件路径或目录路径&#xff0c;并且可以执行各种与路径相关的操作&#xff0c;…

异构超图嵌入的图分类 笔记

1 Title Heterogeneous Hypergraph Embedding for Graph Classification&#xff08;Xiangguo Sun , PictureHongzhi Yin , PictureBo Liu , PictureHongxu Chen , PictureJiuxin Cao , PictureYingxia Shao , PictureNguyen Quoc Viet Hung&#xff09;【WSDM 2021】 2 Co…

模拟移动端美团案例(react版)

文章目录 目录 概述 项目搭建 1.启动项目&#xff08;mock服务前端服务&#xff09; 2.使用Redux ToolTik(RTK)编写store(异步action) 3.组件触发action并渲染数据 一、渲染列表 ​编辑 二、tab切换类交互 三、添加购物车 四、统计区域功能实现 五、购物车列表功能实现 六、控制…

Leetcode算法训练日记 | day23

一、修剪二叉搜索树 1.题目 Leetcode&#xff1a;第 669 题 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff…

netty实现mqtt(IOT)

springbootnettymqtt服务端实现 springbootnettymqtt客户端实现 MQTT协议基本讲解(结合netty) 李兴华netty视频教程中mqtt讲解 EMQX官网、mqttx客户端 IOT云平台 simple&#xff08;6&#xff09;springboot netty实现IOT云平台基本的架构&#xff08;mqtt、Rabbitmq&…

2024/4/2—力扣—最小高度树

代码实现&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ struct TreeNode* buildTree(int *nums, int l, int r) {if (l > r) {return NULL; // 递归出口}struct…

<script setup>组件内的路由守卫

在 Vue 3 中&#xff0c;<script setup> 提供了更简洁的方式来编写组件逻辑&#xff0c;但这并不意味着不能在其中编写路由守卫。然而&#xff0c;路由守卫通常是在全局、路由独享或组件内&#xff08;在 Vue 2 中是通过 beforeRouteEnter、beforeRouteUpdate 和 beforeR…

钩子函数和副作用

Person: react中父组件想要获得子组件的state内容&#xff0c;可以如何实现 ChatGPT: 在React中&#xff0c;父组件可以通过props向子组件传递一个回调函数&#xff0c;子组件在适当的时机调用这个回调函数&#xff0c;并将需要传递的state内容作为参数传递给父组件。这样就…

Cohere推出全新升级版RAG大型AI模型:支持中文,搭载1040亿参数,现开源其权重!

4月5日&#xff0c;知名类ChatGPT平台Cohere在其官方网站上发布了一款全新的模型——Command R。 据官方消息&#xff0c;Command R拥有1040亿个参数&#xff0c;并且支持包括英语、中文、法语、德语在内的10种语言。这一模型的显著特点之一在于其对内置的RAG&#xff08;检索增…

论文复现:torch.max(p,1)

在 PyTorch 中&#xff0c;torch.max 函数用于计算张量&#xff08;tensor&#xff09;的最大值。当你对 torch.max 使用两个参数时&#xff0c;第一个参数是你要操作的张量&#xff0c;第二个参数是维度&#xff08;dimension&#xff09;沿着该维度进行操作。函数会返回两个对…

程序“猿”初学者学习计划

下面是一个为初学者量身定制的学习计划。这个计划假设你是从零开始&#xff0c;并将引导你逐步进入编程世界。记住&#xff0c;学习编程是一场马拉松&#xff0c;不是冲刺&#xff0c;所以保持耐心&#xff0c;持续学习是关键。 第一阶段&#xff1a;基础入门&#xff08;1-2个…

P3613洛谷:深积 P5741旗鼓相当 %P1104生日 set题海战

1-用map可以实现数组对应数值&#xff0c;再用vec传输。 #include<bits/stdc.h> using namespace std; int n, q, mes, x, y, val; typedef pair<int, int> pr; map<pr, int> mp; vector<int> vec;int main(){cin >> n >> q;for(int i 0…

文件加密软件大全,按市场份额排名

文件加密软件大全&#xff0c;按市场份额排名 文件加密是一种保护数据安全的重要手段&#xff0c;通过使用特定的算法将明文文件转化为密文&#xff0c;以防止未经授权的访问、篡改或泄露&#xff0c;市场份额排名的八款软件你需要了解一下。 1、安企神软件 专注于加密和审计…

高阶流程图(SIPOC)

SIPOC高阶流程图是一种流程映射和改进方法&#xff0c;它使用可视化的方式描述一个或多个流程的输入和输出。SIPOC是五个单词的首字母缩写&#xff0c;分别代表供应商&#xff08;Suppliers&#xff09;、输入&#xff08;Inputs&#xff09;、过程&#xff08;Processes&#…

5.120 BCC工具之zfsslower.py解读

一,工具简介 zfsslower 显示慢于阈值的 ZFS 读取、写入、打开和 fsyncs 操作。 二,代码示例 #!/usr/bin/env pythonfrom __future__ import print_function from bcc import BPF import argparse from time import strftime# arguments examples = """exam…