数据结构与算法:线性数据结构

1. 深入理解数组、链表、栈和队列

在计算机科学和软件工程领域,数据结构是构建算法和解决实际问题的基础。其中,数组、链表、栈和队列是最基本、最常用的数据结构之一。本文将深入探讨这些数据结构的定义、特性以及基本操作,帮助读者更好地理解和应用它们。

2. 数组 (Array)

2.1 定义和特性

数组是一种线性数据结构,由相同类型的元素组成,并通过连续的存储空间进行存储。其特性包括:

  • 数组的大小在创建后固定,无法动态改变。
  • 可以通过索引随机访问数组中的元素,时间复杂度为 O(1)。
  • 所有元素的类型相同,通常在内存中占据连续的空间。
2.2 基本操作

数组支持以下基本操作:

  • 访问: 通过索引可以直接访问数组中的元素,时间复杂度为 O(1)。
  • 插入: 在数组中插入元素需要将插入位置后的元素向后移动,时间复杂度为 O(n)。
  • 删除: 从数组中删除元素同样需要将删除位置后的元素向前移动,时间复杂度为 O(n)。
  • 查找: 可以使用线性查找或二分查找等方法在数组中查找指定元素,时间复杂度为 O(n) 或 O(log n)。
示例代码
// 创建一个整型数组
int[] arr = new int[5];// 向数组中插入元素
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;// 访问数组元素
int element = arr[1]; // 访问索引为 1 的元素,值为 2// 删除数组中的元素
// 将索引为 1 的元素删除,后续元素需要向前移动
for (int i = 1; i < arr.length - 1; i++) {arr[i] = arr[i + 1];
}

3. 链表 (Linked List)

3.1 结构和类型

链表是一种基于节点的数据结构,每个节点包含数据和指向下一个节点的指针。常见的链表类型包括:

  • 单链表: 每个节点包含数据和指向下一个节点的指针,最后一个节点指向 null。
  • 双链表: 每个节点包含指向前一个节点和后一个节点的指针,可以双向遍历。
  • 循环链表: 尾节点指向头节点形成环状结构,常用于循环队列等场景。
3.2 基本操作

链表支持以下基本操作:

  • 插入: 在链表中插入节点需要调整相邻节点的指针,时间复杂度为 O(1)。
  • 删除: 从链表中删除节点同样需要调整相邻节点的指针,时间复杂度为 O(1)。
  • 查找: 链表的查找需要遍历链表,时间复杂度为 O(n)。
示例代码
// 定义链表节点
class ListNode {int val;ListNode next;public ListNode(int val) {this.val = val;this.next = null;}
}// 创建一个单链表
ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);// 在链表中插入节点
ListNode newNode = new ListNode(4);
newNode.next = head.next;
head.next = newNode;// 删除链表中的节点
head.next = head.next.next;// 查找链表中的节点
ListNode curr = head;
while (curr != null) {if (curr.val == 3) {// 找到值为 3 的节点break;}curr = curr.next;
}

4. 栈 (Stack) 和队列 (Queue)

4.1 概念及应用场景
  • 栈: 后进先出 (LIFO) 的数据结构,常用于表达式求值、函数调用栈等场景。
  • 队列: 先进先出 (FIFO) 的数据结构,常用于任务调度、消息传递等场景。
4.2 基本操作和实现方式

栈和队列支持以下基本操作:

  • 栈: 基本操作包括入栈 (push)、出栈 (pop)、查看栈顶元素 (peek),可以使用数组或链表实现。
  • 队列: 基本操作包括入队 (enqueue)、出队

(dequeue)、查看队首元素 (front),可以使用数组或链表实现。

示例代码
// 使用数组实现栈
class Stack {int[] arr;int top;public Stack(int size) {arr = new int[size];top = -1;}public void push(int value) {arr[++top] = value;}public int pop() {return arr[top--];}public int peek() {return arr[top];}
}// 使用链表实现队列
class Queue {ListNode front;ListNode rear;public Queue() {front = rear = null;}public void enqueue(int value) {if (rear == null) {front = rear = new ListNode(value);} else {rear.next = new ListNode(value);rear = rear.next;}}public int dequeue() {if (front == null) {return -1; // 队列为空}int value = front.val;front = front.next;if (front == null) {rear = null;}return value;}public int front() {return front == null ? -1 : front.val;}
}

通过以上介绍和示例代码,我们对数组、链表、栈和队列有了更深入的了解。这些基本的数据结构在软件开发中起着至关重要的作用,对于编写高效、可维护的程序至关重要。在实际应用中,我们需要根据问题的特性选择合适的数据结构,并合理设计算法来解决问题。

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

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

相关文章

AI智能语音机器人开源源码系统二次开发各版本部署

产品性能&#xff1a;现在市场上的电话机器人最核心的功能就除了​‌‌有智能电话机器人话术配置&#xff0c;一键导入数据资料&#xff0c;根据时间设置进行外呼。还可以对筛选出意向客户进行按意向度分类。并进入CRM客户管理系统&#xff0c;这是市场是最常见的也是最基本的电…

Python实现FPGA板卡仿真验证方法

在Python中针对FPGA板卡进行仿真&#xff0c;通常可以使用一些特定的库或工具来实现。以下是一些常用的方法&#xff1a; HDL模拟器&#xff1a;对于FPGA设计&#xff0c;通常使用硬件描述语言&#xff08;HDL&#xff09;如Verilog、VHDL来描述电路&#xff0c;然后使用HDL模拟…

Node.js基础---npm与包

包 概念&#xff1a;Node.js 中的第三方模块又叫做包 来源&#xff1a;由第三方个人或团队开发出来的&#xff0c;免费使用&#xff0c;且为开源 为什么需要&#xff1a;Node.js的内置模块只有一些底层API&#xff0c;开发效率低 包是基于内置模块封装出来的&#xff0c;提供更…

python实现跨进程(跨py文件)通信01

前言 项目中总会遇到数据需要跨进程通信的问题&#xff0c;今天就给大家带来一套简单的跨进程通信代码。代码分为服务端与客户端两部分。 一、server端 import multiprocessing import timedef do_socket(conn, addr, ):try:while True:if conn.poll(1) False:time.sleep(0…

ZCANPRO基础操作流程

硬件准备 测试单关节需要准备如下工具&#xff1a; 电源&#xff1a; 推荐使用20-27V直流电源。关节峰值功率为额定功率的三倍。 CAN卡&#xff1a; 推荐使用周立功USB转CANFD卡&#xff0c;我们的单关节测试软件适配了该型号CAN卡驱动。 WHJ系列关节模组 WHJ系列关节模组包含…

2024最新大厂Android面试真题解析,三年老Android经验面经

前言 不知道大家面试的时候&#xff0c;有没有遇到这种情况&#xff0c;面试工资谈的是10K&#xff0c;最后干着40K的活&#xff01;说着冠冕堂皇&#xff0c;提升大家能力的话&#xff0c;做着死命压榨员工&#xff0c;996成了程序员心里的魔咒&#xff01; 初级安卓开发工程…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的活体人脸检测系统(Python+PySide6界面+训练代码)

摘要&#xff1a;本篇博客详细讲述了如何利用深度学习构建一个活体人脸检测系统&#xff0c;并且提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并进行了与前代算法YOLOv7、YOLOv6、YOLOv5的细致对比&#xff0c;展示了其在图像、视频、实时视频流和批量文件处…

golang学习参考记录

1.ORM结果处理 - GoFrame (ZH)-v1.15 - GoFrame官网 - 类似PHP-Laravel, Java-SpringBoot的Go企业级开发框架 2.mysql操作 GORM连接Mysql数据库 - 梯子教程网

CSS_实现三角形和聊天气泡框

如何用css画出一个三角形 1、第一步 写一个正常的盒子模型&#xff0c;先给个正方形的div&#xff0c;便于观察&#xff0c;给div设置宽高和背景颜色 <body><div class"box"></div> </body> <style>.box {width: 100px;height: 100px…

常用git 打tag命令

1.查看所有tag git tag 2.创建 v5.0.0的tag git tag v5.0.0 git tag &#xff08;创建后查看&#xff09; 3.推送到远程tag git push origin v5.0.0 4.删除远程tag git push origin --delete v5.0.0 5.删除本地tag git tag -d v5.0.0 6.添加带有备注信息的tag git tag v5.…

在Vue开发中v-if指令和v-show指令的使用介绍,v-if和v-for的优先级以及使用注意事项的介绍

文章目录 一、条件渲染1、v-if2、v-else3、v-else-if4、\<template> 上的 v-if5、v-show 二、区别&#xff1a;1、渲染区别2、性能区别&#xff1a; 三、v-if和v-for的优先级四、注意事项 一、条件渲染 1、v-if v-if 指令用于条件性地渲染一块内容。这块内容只会在指令…

Java反射机制底层原理

反射机制 这篇文章我是参考了Java 中的反射机制&#xff08;两万字超全详解&#xff09;_java反射-CSDN博客 然后我在这里做一下总结&#xff0c;因为原文章真的很好&#xff0c;我才疏学浅没什么进行补充&#xff0c;只能做出自己的总结并且写一下自己对这个的理解。 原理&…

配置artifactory的反向代理和域名访问

一、概述 在许多情况下&#xff0c;组织会通过反向代理来提供对 Artifactory 的访问。在某些情况下&#xff0c;例如使用 Artifactory 作为 Docker 注册表&#xff0c;这种设置甚至是强制性的。为了简化反向代理的配置&#xff0c;Artifactory 提供了生成反向代理的功能&#x…

实战LangChain(一):构建您的第一个聊天机器人

实战LangChain(一):构建您的第一个聊天机器人 实战LangChain(一):构建您的第一个聊天机器人 文章目录 实战LangChain(一):构建您的第一个聊天机器人引言开始使用1.安装2.使用 openai 构建聊天机器人3.使用千问或者chatglm构建聊天机器人结论引言 doc 地址 简介 |🦜…

户用光伏储能系统组成结构

随着光伏与储能产业的发展和融合&#xff0c;户用光伏储能系统应运而生&#xff0c;“储能”是指电能存储功能&#xff0c;可以保证电网断电或没电的情况下家庭正常用电&#xff0c;提升用电安全性和稳定性。 1.光伏电池板 是光伏系统的核心部分&#xff0c;利用太阳能产生电…

spring boot学习第十三篇:使用spring security控制权限

该文章同时也讲到了如何使用swagger。 1、pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instanc…

vue - - - - - vue3使用draggable拖拽组件

vue3使用draggable拖拽组件 一、组件安装二、插件使用三、遇到的问题1. missing required prop&#xff1a; “itemKey” 一、组件安装 yarn add vuedraggablenext // or npm i -S vuedraggablenext二、插件使用 <template><draggableitem-key"id"class&q…

吴恩达机器学习笔记十三 多分类问题(multiclass) Softmax 神经网络的softmax输出 softmax改进

多分类问题指可能会有多于两个的输出标签&#xff0c;而不只是0或1的问题。 Softmax算法是逻辑回归的一种推广。 例如 y 有四种可能的取值时&#xff1a; 成本函数 例如有十种类别的输出&#xff0c;此时称这个神经网络有一个softmax输出层或上层是softmax层 softmax layer有…

前端 JS 经典:typeof 和 instanceof 区别

1. typeof typeof 用于判断一个变量的数据类型&#xff0c;返回一个表示数据类型的字符串。可以对如下类型进行判断&#xff1a;undefined、boolean、number、string、bigint、symbol、function 和 object。对 null 的判断是object&#xff0c;这是个历史遗留问题。 typeof n…

android高级面试视频,从入门到精通

大佬带你走进Android开发的世界&#xff0c;掌握了这些知识点&#xff0c;学习Android也可以很轻松。 核心分析内容 对于怎么学习Android&#xff0c;主要解决的是3个问题&#xff1a;学什么、怎么学 & 怎么用。 具体如下&#xff1a; 下面&#xff0c;我将带着上述几个问…