当前位置: 首页 > news >正文

栈—数据结构

一、系统栈
  1. 系统栈(System Stack)

    • 用途:系统栈通常指的是调用栈(Call Stack),它用于存储程序执行期间的函数调用信息。每当一个函数被调用时,系统栈会记录这个调用的状态,包括返回地址、局部变量、参数、函数之间的调用关系等。
    • 行为:系统栈是自动管理的,程序员通常不需要直接操作它。当函数执行完毕,系统栈会自动清理并返回到上一个函数调用的状态。
    • 作用域:系统栈通常与程序的执行流程紧密相关,它帮助维护程序的执行上下文。

注意

  • 保护现场的地址,是执行指令的下一条指令的地址
  • 先进后处,后进先出,FILO
  • 系统栈区是操作系统自己进行保护
二、数据结构中的栈
  1. 数据栈(Data Stack)

    • 用途:数据栈通常指的是用户定义的栈,用于存储数据元素。数据栈可以用于各种算法和数据结构的实现,如表达式求值、括号匹配、函数调用的参数传递等。
    • 行为:数据栈由程序员显式管理,需要程序员编写代码来执行push(入栈)和pop(出栈)操作。
    • 作用域:数据栈的作用域通常由程序员定义,它可以是全局的,也可以是局部的,取决于程序的设计。
  1. 数据结构栈:先进后出、后进先出
  2. 结构:只允许从一端进行数据的插入和删除的线性的存储结构
  3. 含有:栈顶(输入插入和删除的地方)和栈底
  4. 栈分为数据栈和链式栈
三、数据栈
3.1、满栈

1、入栈:先挪栈顶指针,再放入数据

2、出栈:先移出数据,再移动指针。

3.2、空栈

1、入栈:先放入输入,再移动栈顶指针

2、出栈:先移动栈顶指针,再数据弹出

3.3、增栈、减栈

栈的增长方向

入栈的方向

1、栈顶由内存高地址向低地址

2、栈顶从低地址向高地址

1、满增栈

入栈的方向是是增栈的方式,放入数据的是满栈的方式。

2、满减栈

入栈的方向是是减栈的方式,放入数据的是满栈的方式。

3、空增栈

入栈的方向是是增栈的方式,放入数据的是空栈的方式。

4、空减栈

入栈的方向是是减栈的方式,放入数据的是空栈的方式。

四、链式栈
4.1、操作

链式栈:

1、创建栈

Stack_t *create_stack()
{Stack_t *stack = malloc(sizeof(Stack_t));if(NULL == stack){perror("fail stack");return NULL;}stack->ptop = NULL;stack->clen = 0;return stack;
}

2、入栈

int push_stack(Stack_t *stack,Datatype data)
{SNode_t *node = malloc(sizeof(SNode_t));if(node == NULL){perror("fail error");return -1;}node->data = data;node->pnext = NULL;node->pnext = stack->ptop;stack->ptop = node;stack->clen++;return 0;
}

3、出栈(看一下,出去的元素,所以和6一样)

int pop_stack(Stack_t *stack,Datatype *data)
{if(stack->ptop == NULL){return -1;}SNode_t *node = stack->ptop;*data = stack->ptop->data;stack->ptop = node->pnext;free(node);stack->clen--;
}

4、清空栈(把所有结点都删除)

void clear_stack(Stack_t *stack)
{if(stack->ptop == NULL){return;}SNode_t *node = stack->ptop;while(stack->ptop != NULL){SNode_t *node = stack->ptop;stack->ptop = node->pnext; free(node);stack->clen--;}
}

5、判空(判断该栈)

int is_empty_stack(Stack_t *stack)
{if(stack->ptop == NULL){return 1;}else{return 0;}
}

6、获取栈顶元素(获取栈顶元素,在外面开一个空间,将该空间的地址传过去,进行获取元素,以便于区分元素还是返回值)

int get_stack_top(Stack_t *stack,Datatype *data)
{if(stack->ptop == NULL){return -1;}*data = stack->ptop->data;return 0;
}

7、销毁栈

void destory_stack(Stack_t *stack)
{clear_stack(stack);free(stack);
}
五、系统栈和数据结构中的区别
  • 控制方式:系统栈由操作系统或运行时环境自动管理,而数据栈由程序员控制。
  • 用途:系统栈主要用于跟踪函数调用和维护执行上下文,数据栈用于数据的临时存储和操作。
  • 可见性:系统栈对程序员通常是不可见的,而数据栈是程序员可以直接操作的。
  • 生命周期:系统栈的生命周期与函数调用的生命周期相关,而数据栈的生命周期由程序员定义。
  • 相同之处:都是先进后出的结构,只是管理用户不同。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【笔记】第一章 气体的PVT关系
  • 俄罗斯电商母婴产品好卖吗,Ozon爆款选品推荐
  • k8s服务发布Ingress
  • Tensorflow2 如何保存模型参数,实现断点续训,提高模型训练效率?-- Tensorflow自学笔记15
  • Mac电脑剪切板在哪里找 苹果电脑剪切板打开教程【详解】
  • 开发工具和框架
  • python绘制3D瀑布图
  • 使用docker安装jenkins,然后使用jenkins本地发版和远程发版
  • TCP远程命令执行
  • 详细阐述Activity的生命周期
  • 下班后做小红书第7个月,涨粉7w,累计变现5w+,我只用到五个点
  • FPGA开发:Verilog基础语法
  • 【稀疏矩阵】使用torch.sparse模块
  • ML20_贝叶斯模型平均BMA详解
  • LeetCode 61. 旋转链表
  • [笔记] php常见简单功能及函数
  • 〔开发系列〕一次关于小程序开发的深度总结
  • canvas 绘制双线技巧
  • CentOS7 安装JDK
  • JavaScript创建对象的四种方式
  • JavaScript设计模式之工厂模式
  • Promise面试题2实现异步串行执行
  • Protobuf3语言指南
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Python_网络编程
  • SpringCloud集成分布式事务LCN (一)
  • 产品三维模型在线预览
  • 分享一份非常强势的Android面试题
  • 区块链分支循环
  • 时间复杂度与空间复杂度分析
  • 一个SAP顾问在美国的这些年
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • #Linux(Source Insight安装及工程建立)
  • #Z0458. 树的中心2
  • (2)leetcode 234.回文链表 141.环形链表
  • (LeetCode C++)盛最多水的容器
  • (二)WCF的Binding模型
  • (二)斐波那契Fabonacci函数
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (学习总结16)C++模版2
  • (转)ORM
  • **CI中自动类加载的用法总结
  • .Net - 类的介绍
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .net core Swagger 过滤部分Api
  • .net core 管理用户机密
  • .Net Winform开发笔记(一)
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • @EventListener注解使用说明
  • @staticmethod和@classmethod的作用与区别
  • [1204 寻找子串位置] 解题报告
  • [16/N]论得趣
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略