3.21系统栈、数据结构栈、栈的基本操作、队列、队列的基本操作------------》

news/2024/5/9 5:44:59/文章来源:https://blog.csdn.net/xxx64646649/article/details/136922626

先进后出、后进先出

一、系统栈


大小:8MB

1、局部变量

2、未经初始化为随机值

3、代码执行到变量定义时为变量开辟空间

4、当变量的作用域结束时回收空间

5、函数的形参和返回值

6、函数的调用关系、保护现场和恢复现场

7、栈的增长方向,自高向低增长

二、栈:FILO


怎样具备先进后出、后进先出?

类似羽毛球桶

FILO(栈)


只允许从一端进行数据的插入和删除的线性存储结构(线性表)(一对一的线性存储结构,与顺序表、链式表类似)

插入:入栈、压栈 — 栈顶(允许操作)

删除:出栈、弹栈 — 栈底(不允许操作)顺序表——顺序栈
满增栈        满减栈        空增栈        空减栈

入栈时操作方法不同

满、空栈

栈顶所在位置是否存有元素

增、减栈
取决于栈增长的方向

增:栈顶由低地址向高地址

减:栈顶由高地址向低地址

链式表——链式栈


栈顶、栈底

三.栈的基本操作:

注:只针对于链式栈

1.创建栈

  5 LINKSTACK_LIST *creat_link()6 {7     LINKSTACK_LIST *plist = malloc(sizeof(LINKSTACK_LIST));8     if(NULL == plist)9     {10         perror("fail to malloc!");11         return NULL;12     }13     plist->phead = NULL;14     plist->clen = 0;15     16     return plist;17 }

2.入栈(头插)

 26 int push_head_linkstack(LINKSTACK_LIST *plist,DATA_TYPE data)27 {28     LINKSTACK_NODE *pnode = malloc(sizeof(LINKSTACK_NODE));29     if(NULL == pnode)30     {31         perror("fail to malloc");32     }33     pnode -> data = data;34     pnode ->pnext = NULL;35     36     pnode ->pnext = plist->phead;37     plist->phead = pnode;38 39     plist->clen++;40     return 0;41 }

3.出栈

 42 /* 出栈 shanchu*/43 int pop_head_delete(LINKSTACK_LIST *plist)44 {45     46     LINKSTACK_NODE *save = malloc(sizeof(LINKSTACK_NODE));                                                                                                                                              47     LINKSTACK_NODE *ptmp = NULL;48     if(is_empty_linkstack(plist))49     {50         printf("kong ");51         return 0;52     }53     else54     {55         ptmp = plist->phead ;56         if(ptmp->pnext == NULL)57         {58             plist->phead = NULL;59             save->data = ptmp->data;60             printf("删除的值:%d \n",save->data);61             free(ptmp);62         }63         else64         {65             plist -> phead = ptmp -> pnext;66             save->data = ptmp->data;67             printf("删除的值:%d \n",save->data);68             free(ptmp);69         }70 //      free(save);71     }72 }

4.获取栈顶元素

 93 /*获取栈顶元素*/94 int linkstack_top_msg(LINKSTACK_LIST *plist)95 {96     LINKSTACK_NODE *p = malloc(sizeof(LINKSTACK_NODE));97     LINKSTACK_NODE *ptmp = NULL;98     if(is_empty_linkstack(plist))99     {
100         return 0;
101     }
102     else
103     {
104         ptmp = plist->phead;
105         p = ptmp;
106         printf("顶端元素:%d \n",p->data);
107     }   
108 
109 }

5.清空栈

110 /*清空栈*/
111 int linkstack_msg_isempty(LINKSTACK_LIST *plist)
112 {
113     LINKSTACK_NODE *ptmp = plist->phead;
114     if(is_empty_linkstack(plist))
115     {
116         return 0;
117     }
118     else
119     {
120         while(ptmp!=NULL)
121         {
122             ptmp = ptmp -> pnext;
123             pop_head_delete(plist);
124         }
125     }
126 }

6.销毁栈

127 /*销毁*/
128 int linkstack_destory(LINKSTACK_LIST *plist)
129 {
130     linkstack_msg_isempty(plist);
131     free(plist);
132 }
133 

7.测试遍历.

 74 /*遍历*/75 void list_for_each(LINKSTACK_LIST *plist)76 {77     if(is_empty_linkstack(plist))78     {79         printf("空");80         return ;81     }82     LINKSTACK_NODE *ptmp = plist->phead;83 84     while(ptmp != NULL)85     {86         printf("%d ",ptmp->data);87         ptmp = ptmp -> pnext;88 89     }90     putchar('\n');91     return ;92 }

四、队列:FIFO

概念

允许从一端进行数据插入,而另一端进行数据删除的线性表

特性

先进先出、后进后出

应用场景:缓冲区(数据缓存)

为了解决高速设备和低速设备交互时速度不匹配问题,进行缓存(缓冲)

队列的基本操作

1.创建队列

  5 /*创建队列*/6 QUEUE_LIST *creat_link()7 {8     QUEUE_LIST *plist = malloc(sizeof(QUEUE_LIST));9     if(NULL == plist)10     {11         perror("fail to malloc!");12         return NULL;13     }14     plist->phead = NULL;15     plist->preal = NULL;16     plist->clen = 0;17 18     return plist;19 }

2.入队

 25 /*入队*/26 int push_tail_queue(QUEUE_LIST *plist,DATA_TYPE data)27 {28 29     QUEUE_NODE *pnode = malloc(sizeof(QUEUE_NODE));30     if(NULL == pnode)31     {32         perror("fail to malloc");33         return 0;34     }35     pnode->data = data;36     pnode ->pnext =NULL;37 38     if(plist->preal != NULL)39     {40         plist->preal->pnext = pnode;41         plist->preal = pnode;42     }43     else    44     {45         plist->preal = pnode;46         plist->phead = pnode;47     }48     plist->clen++;49 }

3.出队

 50 /*出队*/51 int pop_tail_delete(QUEUE_LIST *plist)52 {53     QUEUE_NODE *ptmp;54     QUEUE_NODE *save;55     if(is_empty_queue(plist))56     {57         printf("kong ");58         return 0;59     }60     else61     {   62         if(plist->phead->pnext ==NULL) //仅有一个数据63         {64             free(plist->phead);65             plist->phead = plist->preal =NULL;66         }67         else//多个数据68         {69             ptmp = plist->phead->pnext;70             save = ptmp;71             free(plist->phead);72             plist->phead = ptmp;73             printf("对头第一个数据:%d \n",save->data);74         }75         plist->clen--;76     }77 }78 

4.清空队列

114 /*清空队列*/
115 int queue_empty(QUEUE_LIST *plist)
116 {
117     QUEUE_NODE *ptmp = plist->phead;
118     if(is_empty_queue(plist))
119     {
120         return 0;
121     }
122     else
123     {   
124         while(ptmp!=NULL)
125         {
126             ptmp = ptmp -> pnext;
127             pop_tail_delete(plist);
128         }
129 
130     }
131 
132 }

5.获取队列队头的数据

96 /*获取队头信息*/97 int queue_top_msg(QUEUE_LIST *plist)98 {99     QUEUE_NODE *p=malloc(sizeof(QUEUE_NODE));
100     QUEUE_NODE *ptmp;
101     
102     if(is_empty_queue(plist))
103     {
104         return 0;
105     }
106     else
107     {
108         ptmp = plist->phead;
109         p = ptmp;
110         printf("队头数据: %d \n",p->data);
111     }
112 
113 }

6.销毁队列

133 /*销毁队列*/
134 int queue_destort(QUEUE_LIST *plist)
135 {
136     queue_empty(plist);
137     free(plist);
138 }

7.测试(遍历)

 79 /*遍历*/80 void queue_for_each(QUEUE_LIST *plist)81 {82     if(is_empty_queue(plist))83     {84         printf("空");85         return ;86     }87     QUEUE_NODE *ptmp = plist->phead;88     while(ptmp != NULL)89     {90         printf("%d ",ptmp->data);91         ptmp=ptmp->pnext;92     }93     putchar('\n');94     return ;95 }

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

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

相关文章

yolov8 pose keypoint解读

yolov8进行关键点检测的代码如下: from ultralytics import YOLO# Load a model model YOLO(yolov8n.pt) # pretrained YOLOv8n model# Run batched inference on a list of images results model([im1.jpg, im2.jpg]) # return a list of Results objects# Pr…

SD卡备份和烧录ubuntu20.04镜像

设备及系统:nuc幻影峡谷工控机,ubuntu20.04,树莓派4B,SD卡读卡器 一、确定SD卡设备号的两种方法 方法1: 将有ubuntu镜像的SD卡插入读卡器,再将读卡器插入电脑主机,在 工具 中打开 磁盘&#…

PostgreSQL FDW(外部表) 简介

1、FDW: 外部表 背景 提供外部数据源的透明访问机制。PostgreSQL fdw(Foreign Data Wrapper)是一种外部访问接口,可以在PG数据库中创建外部表,用户访问的时候与访问本地表的方法一样,支持增删改查。 而数据则是存储在外部,外部可以是一个远程的pg数据库或者其他数据库(…

企业微信可以更换公司主体吗?

企业微信变更主体有什么作用?当我们的企业因为各种原因需要注销或已经注销,或者运营变更等情况,企业微信无法继续使用原主体继续使用时,可以申请企业主体变更,变更为新的主体。企业微信变更主体的条件有哪些&#xff1…

springboot多模块

这里springboot使用idea中的 Spring Initializr 来快速创建。 一、demo 1、创建父项目 首先使用 Spring Initializr 来快速创建好一个父Maven工程。然后删除无关的文件,只需保留pom.xml 文件。 (1)new Project -> spring initializr快…

基于spring boot的个人博客系统的设计与实现(带源码)

随着国内市场经济这几十年来的蓬勃发展,突然遇到了从国外传入国内的互联网技术,互联网产业从开始的群众不信任,到现在的离不开,中间经历了很多挫折。本次开发的个人博客系统,有管理员,用户,博主…

从一次 RPC 请求,探索 MOSN 的工作流程

王程铭(呈铭) 蚂蚁集团技术工程师,Apache Committer 专注 RPC、Service Mesh 和云原生等领域。 本文 7368 字,预计阅读 15 分钟 前言 MOSN(Modular Open Smart Network)是一款主要使用 Go 语言开发的云…

吴恩达深度学习笔记:神经网络的编程基础2.5-2.8

目录 第一门课:神经网络和深度学习 (Neural Networks and Deep Learning)第二周:神经网络的编程基础 (Basics of Neural Network programming)2.5 导数(Derivatives)2.6 更多的导数例子(More Derivative Examples&…

Node.js学习(一)

版权声明 本文章由B站上的黑马课程整理所得,仅供个人学习交流使用。如涉及侵权问题,请立即与本人联系,本人将积极配合删除相关内容。感谢理解和支持,本人致力于维护原创作品的权益,共同营造一个尊重知识产权的良好环境…

【二叉树】Leetcode 543. 二叉树的直径【简单】

二叉树的直径 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例1: 输入:root [1,2…

C语言实现顺序表(增,删,改,查)

目录 一.概念: 1.静态顺序表:使用定长数组存储元素。 2.动态顺序表:使用动态开辟的数组存储。 二.顺序表的实现: 1.顺序表增加元素 1.检查顺序表 2.头插 3.尾插 2.顺序表删除元素 1.头删 2.尾删 3.指定位置删 3.顺序表查找元素 …

使用Qt生成图片

Qt之生成png/jpg/bmp格式图片_qt生成图片-CSDN博客 (1)使用QPainter 示例关键代码: QImage image(QSize(this->width(),this->height()),QImage::Format_ARGB32);image.fill("white");QPainter *painter new QPainter(&image);painter->…

深入浅出:探索Hadoop生态系统的核心组件与技术架构

目录 前言 HDFS Yarn Hive HBase Spark及Spark Streaming 书本与课程推荐 关于作者: 推荐理由: 作者直播推荐: 前言 进入大数据阶段就意味着 进入NoSQL阶段,更多的是面向OLAP场景,即数据仓库、BI应用等。 …

TCPView下载安装使用教程(图文教程)超详细

「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:更多干货,请关注专栏《网络安全自学教程》 TCPView是微软提供的一款「查看网络连接」和进程的工具,常用来查看电脑上的TCP/UDP连接…

【Leetcode】2580. 统计将重叠区间合并成组的方案数

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接🔗 给你一个二维整数数组 ranges ,其中 ranges[i] [starti, endi] 表示 starti 到 endi 之间(包括二者)的所有整数都包含在第 i 个区间中。 你需要…

MappedByteBuffer VS FileChannel:从内核层面对比两者的性能差异

本文基于 Linux 内核 5.4 版本进行讨论 自上篇文章《从 Linux 内核角度探秘 JDK MappedByteBuffer》 发布之后,很多读者朋友私信我说,文章的信息量太大了,其中很多章节介绍的内容都是大家非常想要了解,并且是频繁被搜索的内容&…

ubuntu 中安装docker

1 资源地址 进入ubuntu官网下载Ubuntu23.04的版本的镜像 2 安装ubuntu 这里选择再Vmware上安装Ubuntu23.04.6 创建一个虚拟机,下一步下一步 注意虚拟机配置网络桥接,CD/DVD选择本地的镜像地址 开启此虚拟机,下一步下一步等待镜像安装。 3…

Git bash获取ssh key

目录 1、获取密钥 2、查看密钥 3、在vs中向GitHub推送代码 4、重新向GitHub推送修改过的代码 1、获取密钥 指令:ssh-keygen -t rsa -C "邮箱地址" 连续按三次回车,直到出现类似以下界面: 2、查看密钥 路径:C:\U…

银行监管报送系统介绍(十一):金融基础数据报送系统

为了全面落实和实现国务院办公厅下发《关于全面推进金融业综合统计工作的意见》中的综合统计工作的总体目标,中国人民银行调查统计司于2020年6月12日下发了《关于建立金融基础数据统计制度的通知(试行)》。 2020金融基础数据采集报送 报送时…

Kubernetes概念:服务、负载均衡和联网:2. Gateway API

Gateway API 官方文档:https://kubernetes.io/zh-cn/docs/concepts/services-networking/gateway/ Gateway API 通过使用可扩展的、角色导向的、 协议感知的配置机制来提供网络服务。它是一个附加组件, 包含可提供动态基础设施配置和高级流量路由的 API…