顺序表、链表、栈和队列总结

目录

顺序表

链表

队列

总结

补充

顺序表

实现

链表

实现

实现

队列

实现


    顺序表、链表、栈和队列都是线性数据结构,但它们在管理和访问数据方面有不同的特点和用途。以下是它们之间的主要区别:

顺序表

  • 存储方式:在连续的内存空间中存储元素。
  • 访问方式:通过索引直接访问,时间复杂度为O(1)。
  • 插入/删除:在表尾插入或删除元素,时间复杂度为O(n),因为可能需要移动元素。
  • 动态性:通常需要预先分配固定大小的存储空间,但如果需要,可以动态扩容。
  • 内存占用:可能会有未使用的内存空间,因为通常会分配比当前所需更大的空间。

链表

  • 存储方式:由一系列节点组成,每个节点包含数据域和指向下一个节点的指针。
  • 访问方式:需要从头节点开始遍历,时间复杂度为O(n)。
  • 插入/删除:在任意位置插入或删除元素,时间复杂度为O(1),因为只需改变指针。
  • 动态性:可以动态地分配节点,因此不需要预先分配固定大小的存储空间。
  • 内存占用:每个节点只存储数据和指向下一个节点的指针,因此可能更节省内存。

  • 特点:后进先出(LIFO)的数据结构。
  • 存储方式:可以是顺序表或链表的形式。
  • 访问方式:只能访问栈顶元素,时间复杂度为O(1)。
  • 插入/删除:只能在栈顶插入或删除元素,时间复杂度为O(1)。
  • 动态性:可以是固定大小的,也可以是动态扩容的。
  • 内存占用:与顺序表类似,可能会有未使用的内存空间。

队列

  • 特点:先进先出(FIFO)的数据结构。
  • 存储方式:可以是顺序表或链表的形式。
  • 访问方式:只能访问队头或队尾元素,时间复杂度为O(1)。
  • 插入:在队尾插入元素,时间复杂度为O(1)。
  • 删除:从队头删除元素,时间复杂度为O(1)。
  • 动态性:可以是固定大小的,也可以是动态扩容的。
  • 内存占用:与顺序表类似,可能会有未使用的内存空间。

总结

  • 顺序表链表的主要区别在于存储方式和内存利用率。顺序表适合随机访问,而链表适合动态插入和删除。
  • 队列都是线性数据结构,但它们的操作方式不同。栈是后进先出的,而队列是先进先出的。
  • 队列通常都可以用顺序表或链表来实现,根据需要选择。

选择哪种数据结构取决于具体应用场景和对数据操作的频繁程度。

补充

队列的实现

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数 组头上出数据,效率会比较低。

栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的 代价比较小。

顺序表

是一种线性表,在C语言中通常通过数组来实现。它具有以下特点:

  1. 连续的内存空间:顺序表中的元素存储在一块连续的内存空间中。
  2. 随机访问:可以通过下标直接访问任何一个位置的元素,访问时间为常数时间O(1)。
  3. 固定容量:通常情况下,顺序表的容量是固定的,当需要存储的元素个数超过当前容量时,需要进行扩容操作。

在C语言中实现顺序表,需要定义以下几个基本操作:

  • 初始化:创建一个空的顺序表。
  • 插入:在顺序表的指定位置插入一个元素。
  • 删除:删除顺序表中指定位置的元素。
  • 查找:查找顺序表中某个元素的索引。
  • 扩容:当顺序表满时,增加其容量。
  • 打印:打印顺序表中的所有元素。

下面是一个简单的顺序表在C语言中的

实现
#include <stdio.h>
#include <stdlib.h>typedef struct {int *data;int size;
} SequenceList;SequenceList *init_sequence_list(int size) {SequenceList *list = (SequenceList *)malloc(sizeof(SequenceList));list->data = (int *)malloc(size * sizeof(int));list->size = size;return list;
}void free_sequence_list(SequenceList *list) {free(list->data);free(list);
}void sequence_list_insert(SequenceList *list, int index, int value) {if (index < 0 || index > list->size) {printf("Index out of bounds\n");return;}for (int i = list->size; i > index; i--) {list->data[i] = list->data[i - 1];}list->data[index] = value;list->size++;
}int sequence_list_get(SequenceList *list, int index) {if (index < 0 || index >= list->size) {printf("Index out of bounds\n");return -1;}return list->data[index];
}

链表

链表是由一系列节点组成,每个节点包含数据域和指向下一个节点的指针。

实现
#include <stdio.h>
#include <stdlib.h>typedef struct Node {int value;struct Node *next;
} LinkList;LinkList *init_link_list() {LinkList *head = (LinkList *)malloc(sizeof(LinkList));head->next = NULL;return head;
}void free_link_list(LinkList *head) {LinkList *temp;while (head != NULL) {temp = head;head = head->next;free(temp);}
}void link_list_insert(LinkList *head, int value) {LinkList *new_node = (LinkList *)malloc(sizeof(LinkList));new_node->value = value;new_node->next = head->next;head->next = new_node;
}

栈是一种后进先出(LIFO)的数据结构。

实现
#include <stdio.h>
#include <stdlib.h>typedef struct {int *data;int top;int size;
} Stack;Stack *init_stack(int size) {Stack *stk = (Stack *)malloc(sizeof(Stack));stk->data = (int *)malloc(size * sizeof(int));stk->top = -1;stk->size = size;return stk;
}void free_stack(Stack *stk) {free(stk->data);free(stk);
}void stack_push(Stack *stk, int value) {if (stk->top >= stk->size - 1) {printf("Stack overflow\n");return;}stk->data[++stk->top] = value;
}int stack_pop(Stack *stk) {if (stk->top < 0) {printf("Stack underflow\n");return -1;}return stk->data[stk->top--];
}

队列

队列是一种先进先出(FIFO)的数据结构。

实现
#include <stdio.h>
#include <stdlib.h>#define QUEUE_SIZE 100typedef struct {int data[QUEUE_SIZE];int front;int rear;int count;
} Queue;Queue *init_queue() {Queue *q = (Queue *)malloc(sizeof(Queue));if (q) {q->front = q->rear = 0;q->count = 0;}return q;
}void free_queue(Queue *q) {free(q);
}int is_queue_empty(Queue *q) {return q->count == 0;
}int is_queue_full(Queue *q) {return q->count == QUEUE_SIZE;
}void enqueue(Queue *q, int value) {if (is_queue_full(q)) {printf("Queue is full. Cannot enqueue.\n");return;}q->data[q->rear] = value;q->rear = (q->rear + 1) % QUEUE_SIZE;q->count++;
}int dequeue(Queue *q) {if (is_queue_empty(q)) {printf("Queue is empty. Cannot dequeue.\n");return -1;}int value = q->data[q->front];q->front = (q->front + 1) % QUEUE_SIZE;q->count--;return value;
}int main() {Queue *q = init_queue();enqueue(q, 1);enqueue(q, 2);enqueue(q, 3);printf("Dequeue: %d\n", dequeue(q));printf("Dequeue: %d\n", dequeue(q));if (is_queue_empty(q)) {printf("Queue is empty.\n");} else {printf("Queue is not empty.\n");}free_queue(q);return 0;
}

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

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

相关文章

使用 ESPCN 模型进行超分辨率图像处理

前言 使用 ESPCN (Efficient Sub-Pixel CNN) 模型对低分辨率的图像&#xff0c;进行超分辨率处理。 效果展示 lowres 表示低分辨率图像&#xff0c;highres 表示高分辨率图像&#xff0c;prediction 表示模型预测的高分辨率图像&#xff0c;可以看出模型在生成高分辨率图像过…

力扣hot100:155. 最小栈(栈,辅助栈存储相关信息)

LeetCode&#xff1a;155. 最小栈 1、尝试单调栈 看到这题说&#xff0c;要常数时间内检索最小元素的栈&#xff0c;想到了单调栈&#xff0c;递增单调栈确实能维护最小值&#xff0c;但是这个最小值是存在一定意义的&#xff0c;即如果后面出现了最小值&#xff0c;那么前面…

光电管道液位传感器与电容式液位开关相比

如今&#xff0c;随着检测液位技术的不断发展&#xff0c;检测液位的方法也越来越多&#xff0c;比如浮球开关、电容式液位传感器、管道式液位传感器等等&#xff0c;那么光电管道液位传感器与电容式液位开关相比&#xff0c;有哪些优势&#xff1f; 光电管道液位传感器采用先…

论文高级图表绘制(Python语言,局部放大图)

本文将通过一个具体的示例,展示如何使用Python语言和Matplotlib库来绘制高级图表,包括局部放大图的制作。适用于多条曲线绘制在同一个图表中,但由于数据量过大,导致曲线的细节看不清,需要对细节进行局部放大。如下图: 环境准备 首先,确保你的Python环境中已经安装了以…

页面加载性能分析中,如何确定哪些资源是关键的,哪些可以延迟加载?

在页面加载性能分析中&#xff0c;确定哪些资源是关键的&#xff0c;哪些可以延迟加载&#xff0c;可以通过以下步骤进行&#xff1a; 使用 Performance 面板&#xff1a; 在 Chrome DevTools 的 Performance 面板中记录页面加载过程。分析记录结果&#xff0c;查看哪些资源加载…

基于SSM+Jsp的高校信息资源共享平台

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

页面加载性能分析时,有哪些常见的性能瓶颈需要特别注意?

在进行页面加载性能分析时&#xff0c;以下是一些常见的性能瓶颈&#xff0c;需要特别注意&#xff1a; 长页面加载时间&#xff1a; 页面加载时间超过行业标准或用户期望&#xff0c;导致用户流失。 高 CPU 使用率&#xff1a; 某些脚本或操作导致 CPU 使用率飙升&#xff0c;…

基于STM32开发的智能家居监控系统

目录 引言环境准备智能家居监控系统基础代码实现&#xff1a;实现智能家居监控系统 4.1 传感器数据读取4.2 电器设备控制4.3 实时数据监控与分析4.4 用户界面与数据可视化应用场景&#xff1a;家庭安全监控与管理问题解决方案与优化收尾与总结 1. 引言 随着智能家居技术的发…

C++的MQTT开发:使用Paho的C++接口实现消息发布、订阅、连接RabbitMQ

C Paho实现MQTT消息发布功能 要使用paho的cpp接口实现发布MQTT消息的功能&#xff0c;需要进行以下步骤&#xff1a; 安装paho库&#xff1a;首先从paho官方网站下载并安装paho的C库。可以从https://www.eclipse.org/paho/clients/cpp/ 下载适合操作系统的版本。 创建MQTT客户…

FM151A,FM171B和利时工控

FM151A,FM171B和利时工控&#xff0c;DCS系统应该具备以下特点&#xff1a;1.系统具备开放的体系结构&#xff0c;可以提供多层的开放数据接口&#xff1b;FM151A,FM171B和利时工控。2.系统应具备强大的处理功能&#xff0c;中型分布式控制系统大型数据采集监控系统功能。FM151…

[数据集][目标检测]室内积水检测数据集VOC+YOLO格式761张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;761 标注数量(xml文件个数)&#xff1a;761 标注数量(txt文件个数)&#xff1a;761 标注类别…

Spark Python环境搭建与优化:深入剖析四个方面、五个方面、六个方面及七个关键要点

Spark Python环境搭建与优化&#xff1a;深入剖析四个方面、五个方面、六个方面及七个关键要点 在大数据处理领域&#xff0c;Apache Spark凭借其出色的性能和灵活性备受瞩目。而要在Python中利用Spark的强大功能&#xff0c;首先需要搭建一个稳定且高效的Spark Python环境。本…

使用小黄鸟(HttpCanary)、VMOS Pro虚拟机对手机APP进行抓包(附带软件)

老规矩先看&#xff0c;效果图&#xff1a; 文章很详细&#xff0c;希望可以耐心看完&#xff0c;保证可以学会抓包&#xff0c;不再走冤枉路&#xff0c;小编在之前看过太多类似文章&#xff0c;折腾了太久才搞懂的&#xff0c;写这篇文章就是不想希望你们像小编一样再花时间…

C++ 20新特性之三向比较运算符

概述 在C中&#xff0c;如果需要对两个自定义类的对象进行比较&#xff0c;我们通常要单独定义6个比较运算符&#xff1a;、!、<、<、>、>。这不仅繁琐&#xff0c;还很容易出错&#xff0c;特别是当比较逻辑复杂时&#xff0c;稍有不慎就会引发不一致的比较结果。…

最新的ffmepg.js前端VUE3实现视频、音频裁剪上传功能

package.json "dependencies": {"ffmpeg/ffmpeg": "^0.12.10","ffmpeg/util": "^0.12.1" }vue3组件代码 根据需要更改 <script setup lang"ts"> import { FFmpeg } from ffmpeg/ffmpeg; import { fetchF…

mac无法读取windows分区怎么办 苹果硬盘怎么读取

对于Mac电脑用户但有Windows系统使用需求的&#xff0c;我们可以通过Boot Camp启动转换助理安装Windows分区这个方案来解决&#xff0c;不过因为两个系统的磁盘格式不同&#xff0c;相应的也会产生一些问题&#xff0c;例如无法正常读取windows分区。下面本文就详细说明mac无法…

在Java中使用SeleniumAPI,超详细

Java中 Selenium相关操作 1 定位元素 1.1 css选择器定位元素 就是定位到页面的元素&#xff0c;本质上就是一个一个的语法 下面举几个具体的例子&#xff1a; 类选择器 按照给定的 class 属性的值&#xff0c;选择所有匹配的元素。 语法&#xff1a;.classname 例子&am…

Sass详细介绍

Sass&#xff08;Syntactically Awesome Stylesheets&#xff09;是一种CSS预处理器&#xff0c;用于增强CSS的功能和灵活性。以下是对Sass的详细介绍&#xff0c;采用分点表示和归纳的方式&#xff1a; 1. Sass的概述 Sass是一种CSS预处理器&#xff0c;它扩展了CSS的语法和…

力扣1358.包含所有三种字符的子字符串数目

力扣1358.包含所有三种字符的子字符串数目 遍历左端点 找到最小的子字符串 res n - j(右边全部) class Solution {public:int numberOfSubstrings(string s) {unordered_map<char,int> cnt;int n s.size(),res0,count3;for(int i0,j0;j<n;j){if(!cnt.count(s[j])…

Python如何巧妙回应:深入解析Python的回应策略与技巧

Python如何巧妙回应&#xff1a;深入解析Python的回应策略与技巧 在编程的世界里&#xff0c;Python以其简洁、易读和强大的功能库赢得了众多开发者的青睐。然而&#xff0c;当我们与Python程序进行交互时&#xff0c;如何巧妙地回应其输出或错误信息&#xff0c;成为了提高编…