堆、栈和队列(数据结构)

堆、栈和队列(数据结构)

这里写目录标题

  • 堆、栈和队列(数据结构)
      • **栈**
      • **队列**
      • 堆(Heap)()
      • 队列(Queue)(FIFO)
      • 栈(Stack)(LIFO)
      • 总结
    • 堆、队列和栈的内存管理
      • 堆(Heap)
      • 堆内存管理
      • 队列(Queue)
      • 队列内存管理
      • 栈(Stack)
      • 栈内存管理
      • 总结

堆、栈和队列是三种常见的数据结构

标题
堆就像一个可以随时增减的垃圾箱。你可以随时往里面扔东西,也可以随时把不需要的东西拿出来。堆的大小可以根据需要进行扩展或收缩,这使得它非常适合用来存储那些大小不固定的数据,比如动态数组、链表、树和图等。堆的内存管理需要程序员手动进行,使用 malloc()calloc()realloc()free() 函数来分配和释放内存。

栈就像一叠盘子,你只能从最上面的盘子开始取盘子。这就是栈的工作原理。在栈中,数据是按照“最后放入的元素先被取出”的原则进行访问的。栈主要用于存储函数调用相关的数据,如局部变量、返回地址和参数等。栈的大小是固定的,由操作系统或编译器在程序启动时分配。栈的内存管理由编译器自动进行,程序员不需要手动分配和释放栈内存。

队列

队列就像一个排队的地方,新来的排在队伍的后面,先来的排在队伍的前面。这就是队列的工作原理。在队列中,元素按照它们被添加的顺序进行访问。队列主要用于实现先进先出(FIFO)的数据结构,常用于任务调度和消息传递。队列的内存通常是固定的,由操作系统或编译器管理。队列的内存管理也是由编译器自动进行的,程序员不需要手动分配和释放队列内存。

下面是对这三种数据结构的比较:

堆(Heap)()

  • 用途:堆主要用于实现优先队列和动态数据结构,如最大堆和最小堆。
  • 特性:堆是一种树形的数据结构,其中每个节点都有子节点。堆通常用于实现排序和优先级调度算法。
  • 操作:堆的操作包括插入(增加节点)和删除(减少节点)。
  • 访问顺序:堆中的元素可以根据其优先级进行访问,优先级高的元素先被访问。
  • 使用场景:优先队列、动态排序、算法实现(如Dijkstra算法)。

队列(Queue)(FIFO)

  • 用途:队列主要用于实现先进先出(FIFO)的数据结构,常用于任务调度和消息传递。
  • 特性:队列是一种线性数据结构,元素按顺序排列,新元素在队列的一端插入,而旧元素在另一端移除。
  • 操作:队列的操作包括入队(在队尾添加元素)和出队(在队头移除元素)。
  • 访问顺序:队列中的元素按照它们被添加的顺序进行访问。
  • 使用场景:任务调度、消息队列、缓存。
  • 两种常见的实现方式:
    1. 数组队列
      • 使用一个数组来存储队列中的元素。
      • 队头和队尾是数组中的两个指针,分别指向队列中第一个元素和最后一个元素的下一个位置。
      • 当队列满时,无法再添加新元素;当队列空时,没有元素可以取出。
    2. 链表队列
      • 使用链表来存储队列中的元素。
      • 链表中的每个节点包含一个数据元素和一个指向下一个节点的指针。
      • 队头和队尾也是两个指针,分别指向队列中第一个元素和最后一个元素的下一个位置。
      • 队列的大小可以根据需要动态变化,不像数组队列那样受限于数组的大小。

栈(Stack)(LIFO)

  • 用途:栈主要用于实现后进先出(LIFO)的数据结构,常用于函数调用、表达式求值和数据暂存。
  • 特性:栈是一种线性数据结构,元素按顺序排列,新元素在栈顶添加,旧元素在栈顶移除。
  • 操作:栈的操作包括压栈(在栈顶添加元素)和弹栈(从栈顶移除元素)。
  • 访问顺序:栈中的元素按照它们被添加的顺序进行访问。
  • 使用场景:函数调用、递归、后缀表达式求值。

总结

  • :用于实现优先队列和动态数据结构,操作复杂,适用于需要优先级排序的场景。
  • 队列:用于实现先进先出(FIFO)的数据结构,操作简单,适用于需要顺序处理的场景。
  • :用于实现后进先出(LIFO)的数据结构,操作简单,适用于需要后入先出的场景。
    每种数据结构都有其特定的应用场景和优势。在实际编程中,选择合适的数据结构可以大大提高程序的效率和性能。

堆、队列和栈的内存管理

堆(Heap)

  • 内存管理:堆是动态分配的内存区域,它允许程序在运行时请求任意大小的内存。堆上的内存由程序员手动管理,包括分配和释放。
  • 内存泄漏:由于堆上的内存需要程序员负责管理,如果程序员忘记释放不再需要的内存,就会导致内存泄漏。
  • 避免内存泄漏:为了避免内存泄漏,程序员应该在不再需要动态分配的内存时,使用 free() 函数将其释放。

堆内存管理

#include <stdio.h>
#include <stdlib.h>int main() {int *ptr;// 分配内存ptr = (int *)malloc(10 * sizeof(int));if (ptr == NULL) {// 内存分配失败exit(1);}// 使用内存for (int i = 0; i < 10; i++) {ptr[i] = i; // 初始化内存}// 释放内存free(ptr); // 释放内存return 0;
}

队列(Queue)

  • 内存管理:队列通常是基于数组或链表实现的,它们的内存管理方式与堆不同。队列的内存通常是固定的,由操作系统或编译器管理。
  • 内存泄漏:由于队列的内存通常是固定的,因此不太可能发生内存泄漏。
  • 避免内存泄漏:对于基于数组或链表的队列,通常不需要担心内存泄漏,因为它们的内存是由操作系统或编译器管理的。

队列内存管理

#include <stdio.h>
#include <stdlib.h>struct Node {int data;struct Node *next;
};int main() {struct Node *head = NULL, *newNode, *temp;// 动态分配内存newNode = (struct Node *)malloc(sizeof(struct Node));newNode->data = 1;newNode->next = NULL;head = newNode;// 使用队列while (1) {// 模拟队列操作}// 释放队列内存while (head != NULL) {temp = head;head = head->next;free(temp);}return 0;
}

栈(Stack)

  • 内存管理:栈是后进先出(LIFO)的数据结构,它由操作系统自动管理。栈的大小通常是固定的,不会在运行期间改变。
  • 内存泄漏:由于栈的内存是自动管理的,因此不太可能发生内存泄漏。
  • 避免内存泄漏:对于栈,通常不需要担心内存泄漏,因为它的内存是由操作系统管理的。

栈内存管理

#include <stdio.h>int main() {int a, b, c;// 局部变量a = 1;b = 2;c = a + b;// 栈上的变量在函数返回时自动销毁printf("c = %d\n", c);return 0;
}

总结

堆上的内存需要程序员手动管理,容易发生内存泄漏。为了避免内存泄漏,程序员应该在不再需要动态分配的内存时,使用 free() 函数将其释放。队列和栈的内存通常是自动管理的,因此不太可能发生内存泄漏。

在实际编程中,避免内存泄漏的最佳实践包括:

  • 对于堆内存,使用 malloc()calloc()realloc()free() 函数进行管理。
  • 对于队列和栈,通常不需要担心内存泄漏,因为它们的内存是由操作系统或编译器管理的。
  • 编写良好的代码,确保在不再需要内存时及时释放。
  • 使用内存泄漏检测工具来发现潜在的问题。
  • 遵循良好的编程习惯,如避免全局变量和静态变量,尽量使用局部变量和动态内存分配。

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

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

相关文章

【Rust】字符串String类型学习

什么是String Rust的核心语言中只有一个String类型&#xff0c;那就是String slice,str通常被当作是&str的借用。String类型是通过标准库提供的&#xff0c;而不是直接编码到核心语言中&#xff0c;它是一个可增长的、可变的、utf-8编码的类型。str和String都是utf-8编码的…

Faiss原理和使用

参考自https://github.com/facebookresearch/faiss/wiki&#xff0c;https://blog.csdn.net/Kaiyuan_sjtu/article/details/121551473 Faiss Faiss是一个用于高效相似性搜索和密集向量聚类的库。它包含搜索任意大小的向量集&#xff08;大小由RAM决定&#xff09;的算法。它还…

【vue教程】一. 环境搭建与代码规范配置

目录 引言Vue 框架概述起源与设计理念核心特性优势 Vue 开发环境搭建环境要求安装 Vue CLI创建 Vue 项目项目结构介绍运行与构建 组件实例基础模板响应式更新 代码规范为什么要使用代码规范在 Vue 项目中使用 ESLint 、PrettierESLint配置 ESLintrules 自定义错误级别 Prettier…

推理的判定定理三种验证方式

1. 真值表技术 2. 公式转换法 3. 主析取范式法 参考&#xff1a;离散数学-电子科技大学

数据结构第21节 归并排序以及优化方案

归并排序&#xff08;Merge Sort&#xff09;是一种分治策略的排序算法。它将一个大数组分成两个子数组&#xff0c;递归地对它们进行排序&#xff0c;然后将排序后的子数组合并成一个有序数组。 Java代码实现&#xff1a; public class MergeSort {public static void main(…

4.Flink程序编程规范

目录 概述 概述 Flink程序编程规范 官网文档速递 1.Obtain an execution environment 获取执行环境2.Load/create the initial data 加载/创建初始数据 > 数据接入3.Specify transformations on this data 针对数据做处理操作 > 数据处理4.Specify where to put the re…

Java-使用Redisson实现的分布式锁

在使用Redisson实现的分布式锁时&#xff0c;可以很容易地在Java中加入多线程代码来模拟并发环境下 的锁行为。以下是一个使用Redisson的RLock接口创建分布式锁并在多线程环境中使用的示例代 码&#xff1a; 首先&#xff0c;需要在项目中添加Redisson的依赖。如果你使用Mav…

LLM-阿里 DashVector + langchain self-querying retriever 优化 RAG 实践【Query 优化】

文章目录 前言self querying 简介代码实现总结 前言 现在比较流行的 RAG 检索就是通过大模型 embedding 算法将数据嵌入向量数据库中&#xff0c;然后在将用户的查询向量化&#xff0c;从向量数据库中召回相似性数据&#xff0c;构造成 context template, 放到 LLM 中进行查询…

python如何判断变量是否可迭代

python如何判断变量是否可迭代&#xff1f;方法如下&#xff1a; 方法一&#xff1a; 适用于python2和python3 >>> from collections import Iterable >>> isinstance("str", Iterable) True 方法二&#xff1a; 适用于python3 s "hello …

InterSystems IRIS使用python pyodbc连接 windows环境,odbc驱动安装,DSN配置,数据源配置

一、创建的数据库和数据 SELECT 1SELECT $ZVERSIONCREATE TABLE MyApp.Person ( ID INT PRIMARY KEY, Name VARCHAR(100) NOT NULL, Age INT, Gender CHAR(1) );CREATE TABLE MyApp.Person2 ( ID INT PRIMARY KEY, Name VARCHAR(100) NOT NULL, Age INT, Gender CHA…

Gil-Pelaez inversion

一、特征函数 A.随即变量的特征函数定义与性质 B.特征函数与PDF的关系 傅里叶变换:C.特征函数与矩函数关系 二、Gil-Pelaez反演定理 输入功率 P i n P_{in}

八、Docker版MySQL主从复制

目录 一、MySQL主从复制原理就不做讲解了&#xff0c;详情请查看MySQL专栏 二、主从复制搭建步骤 1、新建主服务器容器实例3307 2、进入/usr/mysql/mysql-master/conf目录下新建my.cnf 3、修改完配置后&#xff0c;重启master实例 4、进入mysql-master容器 5、在mysql-ma…

MYSQL 四、mysql进阶 9(数据库的设计规范)

一、为什么需要数据库设计 二、范 式 2.1 范式简介 在关系型数据库中&#xff0c;关于数据表设计的基本原则、规则就称为范式。 可以理解为&#xff0c;一张数据表的设计结 构需要满足的某种设计标准的 级别 。要想设计一个结构合理的关系型数据库&#xff0c;必须满足一定的…

13 IP层协议-网际控制报文协议ICMP

计算机网络资料下载&#xff1a;CSDNhttps://mp.csdn.net/mp_blog/creation/editor/140148186 为了更有效的转发IP数据报和提高交付成果的机会&#xff0c;在网际层使用了网际控制报文协议ICMP。ICMP允许主机或路由器报告差错情况和提供有关异常情况的报告。ICMP不是高层协议数…

携程Java后端实习一面

携程的面试比较注重八股文和项目&#xff0c;算法相关没有字节腾讯严厉&#xff0c;大家参加携程的技术岗面试需要重视八股文和项目细节&#xff0c;要学会深挖项目&#xff0c;希望大家早日oc&#x1f60a;&#x1f44d; HashMap底层原理&#xff0c;扩容机制&#xff0c;从并…

Java面试八股之Redis集群Cluster

Redis集群Cluster Redis Cluster是一种基于数据分片&#xff08;Sharding&#xff09;的分布式缓存和存储系统&#xff0c;它实现了数据的水平扩展、高可用性和自动故障转移。以下是对Redis Cluster模式详细实现流程的描述&#xff1a; 1. 初始化与配置 部署节点&#xff1a…

C++ //练习 15.15 定义你自己的Disc_quote和Bulk_quote。

C Primer&#xff08;第5版&#xff09; 练习 15.15 练习 15.15 定义你自己的Disc_quote和Bulk_quote。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /******************************************************************…

Python酷库之旅-第三方库Pandas(026)

目录 一、用法精讲 65、pandas.bdate_range函数 65-1、语法 65-2、参数 65-3、功能 65-4、返回值 65-5、说明 65-6、用法 65-6-1、数据准备 65-6-2、代码示例 65-6-3、结果输出 66、pandas.period_range函数 66-1、语法 66-2、参数 66-3、功能 66-4、返回值 6…

Gooxi受邀参加第三届中国数据中心服务器与设备峰会

7月2-3日&#xff0c;第三届中国数据中心服务器与设备峰会在上海召开&#xff0c;作为国内最聚焦在服务器领域的专业峰会&#xff0c;吸引了来自全国的行业专家、服务器与机房设备厂家&#xff0c;企业IT用户&#xff0c;数据中心业主共同探讨AIGC时代下智算中心设备的设计之道…

2024年最新最全面的Apifox使用-自动化测试

正文 编排测试场景运行测试持续集成查看测试结果 编排测试场景 新建测试场景 测试场景用于将多个接口有序地组合在一起运行&#xff0c;用于测试一个完整业务流程。 打开 Apifox 后点击左侧菜单栏中的“自动化测试”&#xff0c;点击左上角 号&#xff0c;选择所归属的目录…