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

【数据结构】线性结构——数组、链表、栈和队列

目录

前言

一、数组(Array)

1.1优点

1.2缺点

1.3适用场景

二、链表(Linked List)

2.1优点

2.2缺点

2.3适用场景

三、栈(Stack)

3.1优点

3.2缺点

3.3适用场景

四、队列(Queue)

4.1优点

4.2缺点

4.3适用场景


🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。

💡本文由Filotimo__✍️原创,首发于CSDN📚。

📣如需转载,请事先与我联系以获得授权⚠️。

🎁欢迎大家给我点赞👍、收藏⭐️,并在留言区📝与我互动,这些都是我前进的动力!

🌟我的格言:森林草木都有自己认为对的角度🌟。

前言

数据结构指的是计算机科学中用来组织和存储数据的方式,涉及数据元素之间的关系及其操作定义。数据结构可以分为线性结构和非线性结构。其中,线性结构是指数据元素之间存在一对一的关系,包括数组、链表、栈和队列等。


一、数组(Array)

数组是一种在内存中连续存储多个相同类型元素的数据结构。数组通过索引(通常从0开始)来访问每个元素。

示例代码(以下所有代码都是用C语言编写的)

#include <stdio.h>#define SIZE 5int main() {// 创建一个整数数组int arr[SIZE] = {1, 2, 3, 4, 5};// 访问数组元素printf("Element at index 0: %d\n", arr[0]);  // 输出: 1printf("Element at index 2: %d\n", arr[2]);  // 输出: 3// 修改数组元素arr[1] = 10;printf("Updated array: ");for (int i = 0; i < SIZE; ++i) {printf("%d ", arr[i]);}printf("\n");return 0;
}

运行截图

1.1优点

①        快速访问:由于元素在内存中连续存储,可以通过索引直接访问任何元素,时间复杂度为 O(1)。

②        简单:实现简单直观,是最基础的数据结构之一。

1.2缺点

①        固定大小:数组创建时大小固定,通常无法动态扩展,需要预先确定容量。

②        插入和删除操作慢:在数组中间或开头插入或删除元素需要移动其他元素,时间复杂度为 O(n)。

1.3适用场景

数组适合于元素类型固定、需要频繁访问元素且不需要经常插入或删除元素的场景。

二、链表(Linked List)

链表是一种非连续、非顺序的数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针(或引用)。根据指针的指向,链表能形成不同的结构,例如单链表,双向链表,循环链表等。

示例代码

#include <stdio.h>
#include <stdlib.h>// 定义链表节点结构
typedef struct Node {int data;struct Node* next;
} Node;// 创建一个新的节点
Node* create_node(int data) {Node* new_node = (Node*)malloc(sizeof(Node));  // 分配内存new_node->data = data;new_node->next = NULL;return new_node;
}// 向链表末尾添加节点
void append(Node** head_ref, int new_data) {Node* new_node = create_node(new_data);Node* last = *head_ref;if (*head_ref == NULL) {*head_ref = new_node;return;}while (last->next != NULL) {last = last->next;}last->next = new_node;
}// 打印链表
void print_list(Node* node) {while (node != NULL) {printf("%d -> ", node->data);node = node->next;}printf("NULL\n");
}// 释放链表内存
void free_list(Node* node) {Node* temp;while (node != NULL) {temp = node;node = node->next;free(temp);}
}int main() {Node* head = NULL;// 创建链表append(&head, 1);append(&head, 2);append(&head, 3);append(&head, 4);// 打印链表printf("Linked List: ");print_list(head);// 释放链表free_list(head);return 0;
}

运行截图

2.1优点

①        动态大小:链表可以动态地分配内存空间,不像数组需要预先分配固定大小的空间。

②        插入和删除快速:在链表中插入和删除元素不需要移动其他元素,只需要改变指针指向,时间复杂度为 O(1)。

2.2缺点

①        随机访问慢:链表的元素不连续存储,访问特定位置的元素需要从头开始遍历,时间复杂度为 O(n)。

②        额外空间:每个节点除了存储数据外,还需存储指针,占用较多的内存空间。

2.3适用场景

链表适合于需要频繁插入和删除操作、内存空间不确定或者不需要随机访问元素的场景。

三、栈(Stack)

栈是一种特殊的线性表,具有后进先出(LIFO,Last In First Out)的特点,只允许在一端进行插入和删除操作。这一端被称为栈顶,另一端称为栈底。

示例代码

#include <stdio.h>
#include <stdlib.h>#define MAX_SIZE 100  // 栈的最大容量// 定义栈结构体
typedef struct {int items[MAX_SIZE];int top;  // 栈顶指针
} Stack;// 初始化栈
void init(Stack* stack) {stack->top = -1;  // 栈顶指针初始化为-1,表示栈为空
}// 判断栈是否为空
int is_empty(Stack* stack) {return stack->top == -1;
}// 判断栈是否已满
int is_full(Stack* stack) {return stack->top == MAX_SIZE - 1;
}// 入栈操作
void push(Stack* stack, int item) {if (is_full(stack)) {printf("Stack overflow\n");return;}stack->items[++stack->top] = item;  // 栈顶指针先加一,然后添加元素
}// 出栈操作
int pop(Stack* stack) {if (is_empty(stack)) {printf("Stack underflow\n");return -1;  // 返回-1表示出栈失败}return stack->items[stack->top--];  // 返回栈顶元素,并将栈顶指针减一
}// 查看栈顶元素
int peek(Stack* stack) {if (is_empty(stack)) {printf("Stack is empty\n");return -1;  // 返回-1表示栈为空}return stack->items[stack->top];  // 仅返回栈顶元素,不改变栈的状态
}// 获取栈的大小
int size(Stack* stack) {return stack->top + 1;
}int main() {Stack stack;init(&stack);  // 初始化栈push(&stack, 10);push(&stack, 20);push(&stack, 30);printf("Top element is %d\n", peek(&stack));  // 输出: 30printf("Stack size is %d\n", size(&stack));   // 输出: 3printf("Popped element is %d\n", pop(&stack));  // 输出: 30printf("Popped element is %d\n", pop(&stack));  // 输出: 20printf("Top element is %d\n", peek(&stack));  // 输出: 10return 0;
}

运行截图

3.1优点

①        操作简单:只允许在栈顶进行插入和删除操作,实现简单直观。

②        内存管理方便:栈的内存管理由系统自动处理,无需程序员手动管理。


3.2缺点

①        容量限制:栈的大小受限于系统内存的大小,可能会造成栈溢出。

②        不支持随机访问:由于只能操作栈顶元素,无法直接访问栈中间的元素。


3.3适用场景

①        递归算法(如深度优先搜索)

②        表达式求值(如逆波兰表达式)

③        括号匹配(如编译器的语法分析)

④        历史记录(如浏览器前进后退功能)

⑤        撤销操作(如文本编辑器的撤销功能)

四、队列(Queue)

队列是一种具有先进先出(FIFO,First In First Out)特性的数据结构,允许在一端插入(enqueue)元素,另一端删除(dequeue)元素。通常用于需要按顺序处理数据的场景。

示例代码

#include <stdio.h>
#include <stdlib.h>#define MAX_SIZE 100  // 队列的最大容量// 定义队列结构体
typedef struct {int items[MAX_SIZE];int front;  // 队头指针int rear;   // 队尾指针int size;   // 队列当前元素个数
} Queue;// 初始化队列
void init(Queue* queue) {queue->front = 0;queue->rear = -1;queue->size = 0;
}// 判断队列是否为空
int is_empty(Queue* queue) {return queue->size == 0;
}// 判断队列是否已满
int is_full(Queue* queue) {return queue->size == MAX_SIZE;
}// 入队操作
void enqueue(Queue* queue, int item) {if (is_full(queue)) {printf("Queue overflow\n");return;}queue->rear = (queue->rear + 1) % MAX_SIZE;  // 环形队列实现queue->items[queue->rear] = item;queue->size++;
}// 出队操作
int dequeue(Queue* queue) {if (is_empty(queue)) {printf("Queue underflow\n");return -1;  // 返回-1表示出队失败}int dequeued_item = queue->items[queue->front];queue->front = (queue->front + 1) % MAX_SIZE;  // 环形队列实现queue->size--;return dequeued_item;
}// 查看队头元素
int peek(Queue* queue) {if (is_empty(queue)) {printf("Queue is empty\n");return -1;  // 返回-1表示队列为空}return queue->items[queue->front];
}// 获取队列的大小
int size(Queue* queue) {return queue->size;
}int main() {Queue queue;init(&queue);  // 初始化队列enqueue(&queue, 10);enqueue(&queue, 20);enqueue(&queue, 30);printf("Front element is %d\n", peek(&queue));  // 输出: 10printf("Queue size is %d\n", size(&queue));     // 输出: 3printf("Dequeued element is %d\n", dequeue(&queue));  // 输出: 10printf("Dequeued element is %d\n", dequeue(&queue));  // 输出: 20printf("Front element is %d\n", peek(&queue));  // 输出: 30return 0;
}

运行截图

4.1优点

①        按序处理:队列确保元素按照入队的顺序处理,符合先进先出的逻辑。

②        操作简单:队列仅支持在队尾插入和队头删除操作,设计和实现都较为简单。

③        资源管理:队列的大小可以动态增长,灵活适应不同数据量的需求。

4.2缺点

①        固定容量:队列的大小通常是固定的,可能会导致队列满时无法继续入队(队列溢出)。

②        不支持随机访问:只能访问队头元素,不能直接访问队列中间的元素。

4.3适用场景

①        任务调度:用于任务按顺序执行,例如操作系统中的进程调度。

②        消息传递:用于实现异步消息传递机制,例如消息队列中间件。

③        广度优先搜索:在图的遍历中,广度优先搜索算法需要使用队列来管理遍历的节点顺序。

④        缓冲:用于平衡生产者和消费者之间的速度差异,例如生产者消费者模型中的缓冲区。

⑤        网络数据包处理:在网络数据传输中,使用队列来管理接收到的数据包。


相关文章:

【数据结构】线性结构——数组、链表、栈和队列

目录 前言 一、数组&#xff08;Array&#xff09; 1.1优点 1.2缺点 1.3适用场景 二、链表&#xff08;Linked List&#xff09; 2.1优点 2.2缺点 2.3适用场景 三、栈&#xff08;Stack&#xff09; 3.1优点 3.2缺点 3.3适用场景 四、队列&#xff08;Queue&#xff09; 4.1优点…...

json将列表字典等转字符串,然后解析又转回来

在 Python 中使用 json 模块来方便地在数据和 JSON 格式字符串之间进行转换&#xff0c;以便进行数据的存储、传输或与其他支持 JSON 格式的系统进行交互。 JSON 字符串通过 json.loads() 函数转换为 Python 对象。 pthon对象通过json.dumps()转为字符串 import jsonstr_list…...

记录|.NET上位机开发和PLC通信的实现

本文记录源自&#xff1a;B站视频 实验结果&#xff1a;跟视频做下来是没有问题的。能运行。 自己补充做了视频中未实现的读取和写入数据部分【欢迎小伙伴指正不对的地方】 目录 前言一、项目Step1. 创建项目Step2. 创建动态图片展示Step3. 创建图片型按钮Step4. 创建下拉框Ste…...

微服务实战系列之玩转Docker(二)

前言 上一篇&#xff0c;博主对Docker的背景、理念和实现路径进行了简单的阐述。作为云原生技术的核心之一&#xff0c;轻量级的容器Docker&#xff0c;受到业界追捧。因为它抛弃了笨重的OS&#xff0c;也不带Data&#xff0c;可以说&#xff0c;能够留下来的都是打仗的“精锐…...

Linux:信号的概念与产生

信号概念 信号是进程之间事件异步通知的一种方式 在Linux命令行中&#xff0c;我们可以通过ctrl c来终止一个前台运行的进程&#xff0c;其实这就是一个发送信号的行为。我们按下ctrl c是在shell进程中&#xff0c;而被终止的进程&#xff0c;是在前台运行的另外一个进程。因…...

云监控(华为) | 实训学习day2(10)

spring boot基于框架的实现 简单应用 - 用户数据显示 开发步骤 第一步&#xff1a;文件-----》新建---项目 第二步:弹出的对话框中,左侧选择maven,右侧不选任何内容. 第三步&#xff0c;选择maven后&#xff0c;下一步 第4步 &#xff1a;出现对话框中填写项目名称 第5步&…...

数据结构第35节 性能优化 算法的选择

算法的选择对于优化程序性能至关重要。不同的算法在时间复杂度、空间复杂度以及适用场景上有着明显的差异。下面我将结合具体的代码示例&#xff0c;来讲解几种常见的算法选择及其优化方法。 示例 1: 排序算法 场景描述: 假设我们需要对一个整数数组进行排序。 算法选择: …...

每天一个数据分析题(四百三十六)- 正态分布

X为服从正态分布的随机变量N(2, 9), 如果P(X>c)P(X<c), 则c的值为&#xff08;&#xff09; A. 3 B. 2 C. 9 D. 2/3 数据分析认证考试介绍&#xff1a;点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据分析专项练习题库 内容涵盖Python&#xff0c;SQL&…...

跟我学C++中级篇——虚函数的性能

一、虚函数性能 一般来说&#xff0c;面向对象的设计中&#xff0c;继承和多态是其中两个非常重要的特征。从使用的过程来看&#xff0c;一般应用到继承的&#xff0c;使用多态的可能性就非常大。而多态的实现有很多种&#xff0c; 但开发者通常认为的多态&#xff08;动多态&…...

trl - 微调、对齐大模型的全栈工具

文章目录 一、关于 TRL亮点 二、安装1、Python包2、从源码安装3、存储库 三、命令行界面&#xff08;CLI&#xff09;四、如何使用1、SFTTrainer2、RewardTrainer3、PPOTrainer4、DPOTrainer 五、其它开发 & 贡献参考文献最近策略优化 PPO直接偏好优化 DPO 一、关于 TRL T…...

GuLi商城-商品服务-API-品牌管理-品牌分类关联与级联更新

先配置mybatis分页&#xff1a; 品牌管理增加模糊查询&#xff1a; 品牌管理关联分类&#xff1a; 一个品牌可以有多个分类 一个分类也可以有多个品牌 多对多的关系&#xff0c;用中间表 涉及的类&#xff1a; 方法都比较简单&#xff0c;就不贴代码了...

【linux】服务器ubuntu安装cuda11.0、cuDNN教程,简单易懂,包教包会

【linux】服务器ubuntu安装cuda11.0、cuDNN教程&#xff0c;简单易懂&#xff0c;包教包会 【创作不易&#xff0c;求点赞关注收藏】 文章目录 【linux】服务器ubuntu安装cuda11.0、cuDNN教程&#xff0c;简单易懂&#xff0c;包教包会一、版本情况介绍二、安装cuda1、到官网…...

在 Apifox 中如何高效批量添加接口请求 Body 参数?

在使用 Apifox 进行 API 设计时&#xff0c;你可能会遇到需要添加大量请求参数的情况。想象一下&#xff0c;如果一个接口需要几十甚至上百个参数&#xff0c;若要在接口的「修改文档」里一个个手动添加这些参数&#xff0c;那未免也太麻烦了&#xff0c;耗时且易出错。这时候&…...

专业PDF编辑工具:Acrobat Pro DC 2024.002.20933绿色版,提升你的工作效率!

软件介绍 Adobe Acrobat Pro DC 2024绿色便携版是一款功能强大的PDF编辑和转换软件&#xff0c;由Adobe公司推出。它是Acrobat XI系列的后续产品&#xff0c;提供了全新的用户界面和增强功能。用户可以借助这款软件将纸质文件转换为可编辑的电子文件&#xff0c;便于传输、签署…...

车载音视频App框架设计

简介 统一播放器提供媒体播放一致性的交互和视觉体验&#xff0c;减少各个媒体应用和场景独自开发的重复工作量&#xff0c;实现媒体播放链路的一致性&#xff0c;减少碎片化的Bug。本文面向应用开发者介绍如何快速接入媒体播放器。 主要功能&#xff1a; 新设计的统一播放U…...

StarRocks on AWS Graviton3,实现 50% 以上性价比提升

在数据时代&#xff0c;企业拥有前所未有的大量数据资产&#xff0c;但如何从海量数据中发掘价值成为挑战。数据分析凭借强大的分析能力&#xff0c;可从不同维度挖掘数据中蕴含的见解和规律&#xff0c;为企业战略决策提供依据。数据分析在营销、风险管控、产品优化等领域发挥…...

VUE中setup()

在Vue中&#xff0c;setup() 函数是Vue 3.0及更高版本引入的一个重要特性&#xff0c;它是Composition API的入口点。setup() 函数用于初始化组件的状态和逻辑&#xff0c;包括定义响应式数据、方法和生命周期钩子。以下是关于setup() 函数的详细解释&#xff1a; 1. 作用与特…...

【单元测试】SpringBoot

【单元测试】SpringBoot 1. 为什么单元测试很重要&#xff1f;‼️ 从前&#xff0c;有一个名叫小明的程序员&#xff0c;他非常聪明&#xff0c;但有一个致命的缺点&#xff1a;懒惰。小明的代码写得又快又好&#xff0c;但他总觉得单元测试是一件麻烦事&#xff0c;觉得代码…...

分布式搜索引擎ES-elasticsearch入门

1.分布式搜索引擎&#xff1a;luceneVS Solr VS Elasticsearch 什么是分布式搜索引擎 搜索引擎&#xff1a;数据源&#xff1a;数据库或者爬虫资源 分布式存储与搜索&#xff1a;多个节点组成的服务&#xff0c;提高扩展性(扩展成集群) 使用搜索引擎为搜索提供服务。可以从海量…...

TCP三次握手与四次挥手详解

1.什么是TCP TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的通信协议&#xff0c;属于互联网协议族&#xff08;TCP/IP&#xff09;的一部分。TCP 提供可靠的、顺序的、无差错的数据传输服务&…...

【Windows】操作系统之任务管理器(第一篇)

一、操作系统简介 Windows操作系统是由微软公司&#xff08;Microsoft&#xff09;开发的一款图形操作系统&#xff0c;它以其强大的功能和广泛的用户基础&#xff0c;成为了目前世界上用户使用最多、兼容性最强的操作系统之一。以下是关于Windows操作系统的详细介绍&#xff…...

图同构的必要条件

来源&#xff1a;离散数学...

Django获取request请求中的参数

支持 post put json_str request.body # 属性获取最原始的请求体数据 json_dict json.loads(json_str)# 将原始数据转成字典格式 json_dict.get("key", "默认值") # 获取数据参考 https://blog.csdn.net/user_san/article/details/109654028...

kotlin compose 实现应用内多语言切换(不重新打开App)

1. 示例图 2.具体实现 如何实现上述示例,且不需要重新打开App ①自定义 MainApplication 实现 Application ,定义两个变量: class MainApplication : Application() { object GlobalDpData { var language: String = "" var defaultLanguage: Strin…...

记录些MySQL题集(16)

MySQL 存储过程与触发器 一、初识MySQL的存储过程 Stored Procedure存储过程是数据库系统中一个十分重要的功能&#xff0c;使用存储过程可以大幅度缩短大SQL的响应时间&#xff0c;同时也可以提高数据库编程的灵活性。 存储过程是一组为了完成特定功能的SQL语句集合&#x…...

【算法基础】Dijkstra 算法

定义&#xff1a; g [ i ] [ j ] g[i][j] g[i][j] 表示 v i v_i vi​ 到 $v_j $的边权重&#xff0c;如果没有连接&#xff0c;则 g [ i ] [ j ] ∞ g[i][j] \infty g[i][j]∞ d i s [ i ] dis[i] dis[i] 表示 v k v_k vk​ 到节点 v i v_i vi​ 的最短长度&#xff0c; …...

使用 Flask 3 搭建问答平台(三):注册页面模板渲染

前言 前端文件下载 链接https://pan.baidu.com/s/1Ju5hhhhy5pcUMM7VS3S5YA?pwd6666%C2%A0 知识点 1. 在路由中渲染前端页面 2. 使用 JinJa 2 模板实现前端代码复用 一、auth.py from flask import render_templatebp.route(/register, methods[GET]) def register():re…...

pycharm如何debug for循环里面的错误值

一般debug时&#xff0c;在for循环里面的话&#xff0c;需要自己一步一步点。如果循环几百次那种就比较麻烦。此时可以采用try except的方式来解决 例子如下 #ptyhon debug for循环的代码 num[1,2,3,s,4] ans0 for i in num:try:ansiexcept:print(错误) print(ans) 结果如下&a…...

解决网页中的 video 标签在移动端浏览器(如百度访问网页)视频脱离文档流播放问题

问题现象 部分浏览器视频脱离文档流&#xff0c;滚动时&#xff0c;视频是悬浮出来&#xff0c;在顶部播放 解决方案 添加下列属性&#xff0c;可解决大部分浏览器的脱离文档流的问题 <videowebkit-playsinline""playsInlinex5-playsinlinet7-video-player-t…...

.Net--CLS,CTS,CLI,BCL,FCL

1.什么是CLS&#xff1f; 所以.NET专门为此参考每种语言(例如C# &#xff0c;VB&#xff0c;F#)并找出了语言间的共性&#xff0c;然后定义了一组规则&#xff0c;开发者都遵守这个规则来编码&#xff0c;那么代码就能被任意.NET平台支持的语言所通用。 而与其说是规则&#x…...

附近做网站/网络推广项目外包公司

神经网络的结构设计有3个主流的高级技巧&#xff1a;1&#xff0c;高低融合 (将高层次特征与低层次特征融合&#xff0c;提升特征维度的丰富性和多样性&#xff0c;像人一样同时考虑整体和细节)2&#xff0c;权值共享 (一个权值矩阵参与多个不同的计算&#xff0c;降低参数规模…...

郑州网站建设公司 艾特/移动建站模板

办公室是企业办公的地方&#xff0c;对于企业而言&#xff0c;一个办公室的形象对于企业在团队精神、宣传展示时十分关键&#xff0c;对于整体实力协作、客户信赖的展示也是有一定的影响。人们在对办公空间合理、利润较大化利用的同时&#xff0c;如何打造一个时尚的办公空间设…...

下载网站软件免费安装/湖人排名最新

科目二总结 注意!!! 以下情况根据具体情况调节 1.左倒车入库 直行&#xff0c;车头碰住黄线的时候朝左打死&#xff0c;人对准直角朝右回半圈&#xff0c;目视前方&#xff0c;车正了朝右回到初始角度&#xff0c;w朝上 倒车&#xff1a;挂倒挡&#xff0c;后视镜的角碰到黄…...

网络营销方式举个例子/温州seo公司

下面介绍无监督机器学习算法&#xff0c;与前面分类回归不一样的是&#xff0c;这个不知道目标变量是什么&#xff0c;这个问题解决的是我们从这些样本中&#xff0c;我们能发现什么。 这下面主要讲述了聚类算法&#xff0c;跟数据挖掘中的关联挖掘中的两个主要算法。 K均值算法…...

有app怎么做网站/微商怎么做推广加好友

概述&#xff1a; 有些日子没有正襟危坐写博客了&#xff0c;互联网飞速发展的时代&#xff0c;技术更新迭代的速度也在加快。看着Java、Js、Swift在各领域心花路放&#xff0c;也是煞是羡慕。寻了寻.net的消息&#xff0c;也是振奋人心&#xff0c;.net core 1&#xff0c;mon…...

网站建设容易吗/百度竞价seo排名

点击上方“程序员小灰”&#xff0c;选择“置顶公众号” 有趣有内涵的文章第一时间送达&#xff01; 上一次送书活动刚刚完结&#xff0c;有9位幸运的小伙伴得到了想要的图书&#xff0c;但是更多的读者们并没有获奖。 不过大家不必遗憾&#xff0c;慷慨的博文视点再次赞助了10…...