栈 | 队列

系统栈主要保存以下内容:

1.局部变量,2.函数的形参和返回值 3.函数的调用关系

一、栈

1.基本概念

栈是一种特殊的线性表,具有线性结构。表尾为栈顶,表头为栈顶。遵循先进后出原则,只能在栈顶进行插入和删除操作。

2.基本操作

栈的插入操作为入栈(进栈)。栈的删除操作为出栈。如下:

3.栈的顺序存储结构

     它使用一个一维数组来存储栈中的数据元素,数组的下标小的一端作为栈底,另一端作为栈顶。栈顶位置随入栈和出栈操作而变化,因此需要一个整型变量‌top来记录当前栈顶元素在数组中的位置。不多做介绍。

      分类:①满增栈     ②满减栈     ③空增栈     ④空减栈

基本类型类型说明出入栈操作
满增栈栈顶不为空,存储地址由低到高

入栈:栈顶++  入栈数据

出栈:出栈数据,栈顶--

满减栈栈顶不为空,存储地址由高到低

入栈:栈顶--  入栈数据

出栈:出栈数据,栈顶++

空增栈栈顶为空,存储地址由低到高

入栈:入栈数据,栈顶++

出栈:栈顶--,出栈数据

空减栈栈顶为空,存储地址由高到低

入栈:入栈数据,栈顶--

出栈:栈顶++,出栈数据

4.栈的链式存储结构

本质为单向链表。对于链栈来说,基本不存在栈满的情况。除非内存中已经没有可以使用的空间。

基本操作:

#include"link.h"
#include<stdio.h>
Stack_t *create_stack() //创建栈
{Stack_t*slink = malloc(sizeof(Stack_t));if(slink == NULL){perror("fail malloc\n");return NULL;}slink->ptop = NULL;slink->clen = 0;return slink;
}
int is_empty_stack(Stack_t*slink)//判空
{return slink->ptop == NULL;
}
int push_stack(Stack_t*slink,Datatype data)//入栈
{Snode_t *pnode = malloc(sizeof(Snode_t));if(NULL == pnode){perror("fail malloc\n");return -1;}pnode->data = data;pnode->pnext = NULL;pnode->pnext = slink->ptop;slink->ptop = pnode;slink->clen++;return 0;
}
void stack_for_each(Stack_t*slink)//遍历打印
{Snode_t*p = slink->ptop;while(p ){printf("%d\n",p->data);p = p->pnext;}printf("\n");
}
int pop_stack(Stack_t*slink,Datatype * data)//出栈
{if (is_empty_stack(slink))return 0;Snode_t *pdel = slink->ptop;slink->ptop = pdel->pnext;if (data != NULL){*data = pdel->data;}free(pdel);slink->clen--;return 1;
}
int get_stack_top(Stack_t*slink,Datatype *data)//获取栈顶的值
{if(is_empty_stack(slink)){return 0;}Snode_t*p = slink->ptop;*data = p->data;return 1;
}
void clear_stack(Stack_t*slink)//清空栈
{while(!is_empty_stack(slink)){pop_stack(slink,NULL);}
}	
void destroy_stack(Stack_t*slink)//销毁栈
{clear_stack(slink);free(slink);
}

栈的数据类型声明

typedef int Datatype;
typedef struct Snode
{Datatype data;struct Snode*pnext;
}Snode_t;
typedef struct Stack
{Snode_t*ptop;int clen;
}Stack_t;
extern Stack_t *create_stack();
extern int push_stack(Stack_t*slink,Datatype data);
extern int pop_stack(Stack_t*slink,Datatype * data);
extern int get_stack_top(Stack_t*slink,Datatype *data);
extern void clear_stack(Stack_t*slink);
extern void destroy_stack(Stack_t*slink);
extern void stack_for_each(Stack_t*slink);

5.循环栈与链队栈的比较

①在时间复杂度上是一样的,均为0(1)。

②空间性能,顺序栈需要事先确定一个固定的长度,可能会存在内存空间浪费的问题,但它的优势是存取时定位很方便,而链栈则要求每个元素都有指针域,这同时也增加了一些内存开销,但对于栈的长度无限制。所以它们的区别和线性表中讨论的一样,如果栈的使用过程中元素变化不可预料,有时很小,有时非常大,那么最好是用链栈,反之,如果它的变化在可控范围内,建议使用顺序栈会更好一些。

二、队列

1.概念

队列:允许从一端插入数据,另一端删除数据的线性存储结构(FIFO)

管道的本质也是队列,队列主要用于缓存数据

2.基本操作

插入操作为入队操作(队尾) 删除操作为出队操作(队头)

3.顺序队列

使用不当会出现存在假溢出现象,一般使用循环队列,充分利用循环空间。

4.链式队列

初始化:

typedef int QDataType;
typedef struct qnode
{QDataType data;struct qnode *pnext;
}QNode_t;
typedef struct queue
{QNode_t *pfront;QNode_t *prear;int clen;pthread_mutex_t mutex;
}Queue_t;

基本操作:

#include"link.h"
#include<stdio.h>
Queue_t*create_queue()
{Queue_t *qlink = malloc(sizeof(QNode_t));if(qlink == NULL){perror("error malloc 1\n");return NULL;}qlink->pfront = NULL;qlink->prear = NULL;pthread_mutex_init(&(qlink->mutex),NULL);qlink->clen = 0;return qlink;
}
int is_empty_queue(Queue_t*qlink)
{if(NULL == qlink->pfront && qlink->prear == NULL){return 1;}return 0;
}
int push_queue(Queue_t *qlink,QDataType data)
{QNode_t * pnode = malloc(sizeof(QNode_t));pnode->data = data;pnode->pnext = NULL;if(pnode == NULL){perror("error malloc2\n");return -1;}if(is_empty_queue(qlink)){qlink->pfront = pnode;qlink->prear = pnode;}else{QNode_t * p = qlink->prear;p->pnext = pnode;qlink->prear = pnode;qlink->clen++;}
}
int pop_queue(Queue_t *qlink,QDataType  * data)
{QNode_t *del = qlink->pfront;if(is_empty_queue(qlink)){return -1;}if(qlink->clen == 1){qlink->pfront = NULL;qlink->prear = NULL;}qlink->pfront = del->pnext;if(data != NULL){*data = del->data;}free(del);qlink->clen--;return 1;
}
void print_for_each(Queue_t*qlink)
{QNode_t*p = qlink->pfront;while(p){printf("%d\n",p->data);p = p->pnext;}printf("........................\n");
}
int get_queue_pop(Queue_t*qlink,QDataType *data)
{if(is_empty_queue(qlink)){return -1;}QNode_t*p = qlink->pfront;*data = p->data;
}
void clear_queue_pop(Queue_t*qlink)
{while(!is_empty_queue(qlink)){pop_queue(qlink,NULL);}
}
void destroy_queue(Queue_t*qlink)
{clear_queue_pop(qlink);free(qlink);
}

5.循环队列与链队列的比较

①从时间上,其实它们的基本操作都是常数时间,即都为0(1)的,不过循环队列是事先申请好空间,使用期间不释放,而对于链队列,每次申请和释放结点也会存在一些时间开销,如果入队出队频繁,则两者还是有细微差异。

②空间上来说,循环队列必须有一个固定的长度,所以就有了存储元素个数和空间浪费的问题。而链队列不存在这个问题,尽管它需要一个指针域,会产生一些空间上的开销,但也可以接受。所以在空间上,链队列更加灵活。

三、问答。

1.程序运行过程中的栈区和数据结构的栈有什么区别?

程序运行过程中的栈区和数据结构中的栈是两个不同的概念,它们分别属于内存管理和数据结构领域。

  • 数据结构中的栈‌是一种后进先出(LIFO)的数据结构,它只允许在栈顶进行数据的添加(压栈)或移除(出栈)操作。数据结构中的栈是一种抽象数据类型,用于管理数据的存储和访问方式,它不直接涉及物理内存的分配和管理‌。

  • 程序运行过程中的栈区‌则是指内存中的一个特定区域,用于存储局部变量、函数调用的上下文信息等。在程序运行时,操作系统或运行时环境会自动管理这部分内存的分配和释放。栈区的特点是快速分配和释放内存,但空间大小通常受到限制,且只能从栈顶进行操作‌。

简而言之,数据结构中的栈是一种抽象数据类型,用于组织和管理数据;而程序运行过程中的栈区是内存中的一个具体区域,用于存储程序执行时的临时数据和函数调用信息,这两者在计算机科学中各有其用途和重要性‌。

2.队列和栈有什么区别?

①规则不同

1. 队列:先进先出(First In First Out)FIFO

2. 栈:先进后出(First In Last Out )FILO

②对插入和删除操作的限定不同

1. 队列:只能在表的一端进行插入,并在表的另一端进行删除;

2. 栈:只能在表的一端插入和删除。

③遍历数据速度不同

1. 队列:基于地址指针进行遍历,而且可以从头部或者尾部进行遍历,但不能同时遍历,无需开辟空间,因为在遍历的过程中不影响数据结构,所以遍历速度要快;

2. 栈:只能从顶部取数据,也就是说最先进入栈底的,需要遍历整个栈才能取出来,而且在遍历数据的同时需要为数据开辟临时空间,保持数据在遍历前的一致性。

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

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

相关文章

下载Mongodb 4.2.25 版本教程

1、MongoDB 安装包的下载链接 Download MongoDB Community Server | MongoDB 进入如下截图&#xff1a; 2、查找历史版本 往下拉&#xff0c;点击“...”,找到”Archived releases”,点击进入 、 3、下载Mongodb 4.2.25 版本 找到如下图4.2.25版本下载链接&#xff0c;点击就可…

Python输出多位数

作者制作不易&#xff0c;关注、点赞、收藏一下吧&#xff01; 1.第一种:正常直接用循环 以三位数为例: for i in range(100, 1000):print(i) 运行结果( 展示一部分 ): 图1-1 2.第二种:特定位数 以三位数为例: for i in range(1, 5): # 括号内指定那个位的范围for j in r…

【Java那些事】关于Git的使用

目录 下拉代码仓库篇 上传代码篇 下拉代码仓库篇 第一步&#xff0c;下拉代码&#xff0c;复制链接。 &#xff08;从开源网站上复制链接&#xff09; &#xff08;建立本地仓库&#xff09; 这里的URL一般都会自动填充刚刚复制的链接【瞅瞅&#xff0c;确保是想要的那个项…

oracle锁的机制

文章目录 oracle锁的机制1. 概括2.锁的模式3.锁查看 死锁1. 说明2.死锁产生条件3.解决死锁冲突4. 事务和死锁预防总结 oracle锁的机制 1. 概括 1&#xff09;说明 锁是一种机制&#xff0c;多个事务同时访问一个数据库对象时&#xff0c;该机制可以实现对并发的控制 2&…

Android Dialog:Dialog和DialogFragment的区别?DialogFragment如何使用?源码解析

目录 一、Dialog和DialogFragment的区别 Android在DialogFragment推出后&#xff0c;就已经不推荐继续使用Dialog&#xff0c;可替换为DialogFragment&#xff1a; 更好的生命周期管理&#xff1a;DialogFragment能够自动处理Activity的生命周期事件&#xff0c;确保对话框在…

Git 撤回commit

上一篇&#xff0c;Git撤销add&#xff0c;其实已经讲了用reset命令可以取消commit&#xff0c;这里再啰嗦下。先看&#xff1a; git如何撤回已经commit • Worktile社区 首先明确一点&#xff0c;无论是commit还是撤销commit&#xff0c;都是在本地暂存区操作&#xff0c;而…

如何测试一个算法

目录 1.从参数上进行设计 2.从代码逻辑上进行设计 3.从代码性能上进行设计 4.考虑异常情况 5.总结 下面是冒泡排序的代码&#xff0c;我们如何针对这个代价进行测试? public void BubbleSort(int[] arr) {for (int i 0; i < arr.length; i) {for (int j 0; j < a…

CleanMyMac X2024最新官方中文破解版本下载

&#x1f9f9; 嘿&#xff0c;Mac用户们&#xff0c;你们的小助手来了&#xff01; 今天要跟大家分享的&#xff0c;是一个能让你们的电脑焕发新生的神器——CleanMyMac X。这可不是一般的清洁工&#xff0c;它可是拥有超能力的超级英雄哦&#xff01;&#x1f31f; CleanMyMa…

第 1 章:原生 AJAX

原生AJAX 1. AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML&#xff0c;就是异步的 JS 和 XML。通过 AJAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势&#xff1a;无刷新获取数据。AJAX 不是新的编程语言&#xff0c;而是一种将现有的标准组合在一…

文章如何进行谷歌SEO优化?

内容绝对是谷歌seo最花时间以及成本&#xff0c;内容基本决定一个网站的生死&#xff0c;所以文章绝对要重视&#xff0c;而想写好一篇适用于谷歌seo的文章&#xff0c;首要保证的是内容的质量和原创性&#xff0c;这是SEO的核心&#xff0c;对于一篇seo文章来说&#xff0c;关…

MySQL-进阶篇-锁(全局锁、表级锁、行级锁)

文章目录 1. 锁概述2. 全局锁2.1 介绍2.2 数据备份2.3 使用全局锁造成的问题 3. 表级锁3.1 表锁3.1.1 语法3.1.2 读锁3.1.3 写锁3.1.4 读锁和写锁的区别 3.2 元数据锁&#xff08;Meta Data Lock&#xff0c;MDL&#xff09;3.3 意向锁3.3.1 案例引入3.3.2 意向锁的分类 4. 行级…

Java项目:140 springboot203医疗挂号管理系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 一共有管理员、挂号人员、划价人员、医生 四个角色 管理员登录进入本系统操作的功能包括对挂号人员&#xff0c;划价人员&#xff0c;患者&#xff0…

828华为云征文|华为云Flexus X实例MySQL性能加速评测及对比

目录 前言 一、Flexus云服务器X介绍 1.1 Flexus云服务器X实例简介 1.2 Flexus云服务器X实例特点 1.3 Flexus云服务器X实例场景需求 二、Flexus云服务器X购买 2.1 Flexus X实例购买 2.2 购买MySQL加速镜像 2.3 重置密码 2.4 登录服务器 三、Flexus X实例加速MySQL测试 3.1 sysbe…

深入Linux轻量级进程管理:线程创建、线程ID解析与进程地址空间页表探究

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f6b2;Linux线程控制&#x1f40f;POSIX线程库&#x1f415;创建线程&#x1f41f;指令查看轻量级进程指令&#xff1a;ps -a…

java框架第五课(终极版本)SpringBoot

一.关于SpringBoot (1)回忆Spring 传统的Spring由Spring 框架(ioc,aop)加mybatis加Springweb组成&#xff0c;虽然相比原生的java程序Spring框架帮我们大大减少了代码量&#xff0c;减少了冗余&#xff0c;提高了开发效率但是由于Spring框架下的配置和相关的jar包依赖过多&am…

Denodo 连续 4 年获评 Gartner® 数据集成工具魔力象限™ 领导者

Gartner 在其 2023 年数据集成工具魔力象限中连续第四年将 Denodo 评为“领导者”。 Gartner 表示&#xff1a;“由于对数据编织架构、数据产品交付以及支持生成式 AI 的集成数据的需求即将到来&#xff0c;数据集成工具市场正在蓬勃发展。数据和分析领导者应该利用这项研究来…

RabbitMQ 基础架构流程 数据隔离 创建用户

介绍 publisher&#xff1a;消息发送者-exchange&#xff1a;交换机&#xff0c;复制路由的消息-queue&#xff1a;队列&#xff0c;存储消息consumer&#xff1a;消息的消费者 工作流程 publisher消息发送者 -> exchange 交换机 -> queue 队列 -> consumer 消息的消…

基于STM32的多功能车位锁设计

本设计基于STM32的多功能车位锁&#xff0c;该系统主要包括&#xff1a;测距模块、光强采集模块、主控芯片模块、显示模块、摄像模组等。系统以STM32单片机作为主控芯片用来对系统中的外设进行控制并且对传输过来的数据进行处理。通过K210模块来实现图像识别的功能检测车牌是否…

加码产品创新、革新搜索体验 夸克登顶“AI产品榜”月榜

随着人工智能应用到生活中的方方面面&#xff0c;AI生产力工具实现了快速爆发。日前&#xff0c;AI新榜发布8月“AI产品榜”&#xff0c;阿里巴巴旗下夸克凭借一系列产品创新和大模型能力跃升占据首位。在升级App端“超级搜索框”、推出PC端“系统级全场景AI”后&#xff0c;夸…

三文带你轻松上手鸿蒙的AI语音01-实时语音识别

三文带你轻松上手鸿蒙的AI语音01-实时语音识别 前言 HarmonyOSNext中集成了强大的AI功能。Core Speech Kit&#xff08;基础语音服务&#xff09;是它提供的众多AI功能中的一种。 Core Speech Kit&#xff08;基础语音服务&#xff09;集成了语音类基础AI能力&#xff0c;包…