数据结构:栈、队列、链表

目录

​队列

链表


        栈数据结构特点:先入栈的数据后出,此数据结构常用的方法有:入栈push、出栈pop、查看栈顶元素peek等,下方示例以数组实现栈结构

package com.ginko.datastructure;
import lombok.extern.slf4j.Slf4j;/*** 基于数组实现的栈*/
@Slf4j
public class ArrayStack {private int arr[];//栈存放的数据private int top;//栈顶索引/*** 构造栈* @param capacity 栈容量*/public ArrayStack(int capacity) {arr = new int[capacity];top = -1;//初始top为-1}/*** 出栈,从栈顶获取元素* @return*/public int pop() {if(top == -1) {throw new RuntimeException("栈为空,无法出栈...");}return arr[top--];//出栈后,栈顶下移}/*** 入栈* @param value 入栈数据* @return*/public void push(int value) {if(top == arr.length -1) {throw new RuntimeException("栈已满,无法入栈...");}arr[++top] = value;//入栈,先将栈顶++}/*** 获取栈顶数据* @return*/public int peek() {if(top == -1) {throw new RuntimeException("栈为空,没有栈顶数据...");}return arr[top];}public static void main(String[] args) {ArrayStack arrayStack = new ArrayStack(5);arrayStack.push(100);arrayStack.push(90);arrayStack.push(80);arrayStack.push(60);arrayStack.push(50);log.info("出栈数据:{}",arrayStack.pop()); log.info("出栈数据:{}",arrayStack.pop());log.info("栈顶数据:{}",arrayStack.peek());}
}

        测试效果如下,复合预期:

队列

        队列数据结构特点:先入队列的数据先出,此数据结构常用的方法有:入对enQueue、出对deQueue等,下方示例以数组实现队列结构

package com.ginko.datastructure;
import lombok.extern.slf4j.Slf4j;/*** 基于数组实现的队列*/
@Slf4j
public class ArrayQueue {private int arr[];//存放队列元素private int head;//队列头指针private int tail;//队列尾指针private int size;//队列里面数据的个数/*** 构造队列* @param capacity 队列容量*/public ArrayQueue(int capacity) {arr = new int[capacity];head = 0;tail = -1;size = 0;//队列没有数据}/*** 入队* @param value 加入队列的值*/public void enQueue(int value) {//队列满了就不能入队if(size == arr.length) {throw new RuntimeException("队列已满,无法加入队列...");}//加入队列加载数组的末尾arr[++tail] = value;size ++;//队列数据自增}/*** 出队,从队列头获取数据*/public int deQueue() {//队列满了就不能入队if(size == 0) {throw new RuntimeException("队列为空,无法出队列...");}//从队列头获取数据size--;//队列数据减少return arr[head++];}public static void main(String[] args) {ArrayQueue arrayQueue = new ArrayQueue(5);arrayQueue.enQueue(10);arrayQueue.enQueue(20);arrayQueue.enQueue(30);arrayQueue.enQueue(40);arrayQueue.enQueue(50);log.info("出队数据:{}",arrayQueue.deQueue());log.info("出队数据:{}",arrayQueue.deQueue());log.info("队列元素个数:{}",arrayQueue.size);}
}

        测试效果如下,复合预期:

链表

        链表数据结构特点:通过前后指针串联起来完整的数据,包含单向链表、双向链表等,下方示例演示单向链表,核心方法有链表插入元素,删除元素,遍历链表等。

package com.ginko.datastructure;
import lombok.extern.slf4j.Slf4j;/*** 链表,单向链表,在链表的末尾加入数据*/
@Slf4j
public class LinkList {Node head;//头节点int size;//链表中节点的个数public LinkList() {head = null;size = 0;}/*** 加入链表,加入链表的末尾* @param value*/public void addElement(int value) {if(head == null) {//加入链表头head = new Node(value,null);size ++;//链表中节点的个数return;}//找到此链表的末尾节点,遍历后temp节点就是末尾节点Node temp = head;while (temp.next != null) {temp = temp.next;}//新建末尾节点的下一个节点,然后设置末尾节点Node tailNodeNext = new Node(value,null);temp.next = tailNodeNext;size ++;//链表中节点的个数}/*** 删除链表中的元素,核心是找到删除节点的位置* @param value 要删除的链表数据*/public void delElement(int value) {if(head == null) {throw new RuntimeException("链表为空,无法删除元素...");}//删除表头节点if(head.value == value) {//要删除表头Node headNext = head.next;//直接将head next设置为表头就删除表头了head = headNext;size--;//链表中节点的个数}else {//非表头节点,需要遍历整个链表,查询出要删除的节点的上一个节点tempNode temp = head;while (temp.next != null && temp.next.value != value) {temp = temp.next;}if(temp.next.value == value) {if(temp.next != null) {temp.next = temp.next.next;//跳过要删除的节点,指向下一个节点}else {temp.next = null;}}size--;//链表中节点的个数}}/*** 输出链表节点数据*/public void outputLinkInfo() {Node headNode = head;while (headNode != null) {log.info("节点数据:{}",headNode.value);headNode = headNode.next;}}public static void main(String[] args) {LinkList linkList = new LinkList();linkList.addElement(10);linkList.addElement(20);linkList.addElement(30);linkList.addElement(40);linkList.addElement(50);linkList.outputLinkInfo();log.info("链表节点数量:{}",linkList.size);linkList.delElement(20);linkList.delElement(50);linkList.outputLinkInfo();log.info("链表节点数量:{}",linkList.size);}
}/*** 链表中的节点*/
class Node{int value;//节点的值Node next;//链表指针,指向下一个节点public Node(int value,Node next) {this.value = value;this.next = next;}
}

        测试效果如下,复合预期:

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

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

相关文章

Python-难点-uinttest

1 需求要求:unittest.TestCase放在列表中,列表存储的是脚本文件名import使用动态加载方式:importlib.import_module()unittest.TestLoader使用loadTestsFromModule()2 接口3 示例4 参考资料

开源 python 应用 开发(五)python opencv之目标检测

最近有个项目需要做视觉自动化处理的工具,最后选用的软件为python,刚好这个机会进行系统学习。短时间学习,需要快速开发,所以记录要点步骤,防止忘记。 链接: 开源 python 应用 开发(一&#xf…

ABP VNext + OpenTelemetry + Jaeger:分布式追踪与调用链可视化

ABP VNext OpenTelemetry Jaeger:分布式追踪与调用链可视化 🚀 📚 目录ABP VNext OpenTelemetry Jaeger:分布式追踪与调用链可视化 🚀背景与动机 🌟环境与依赖 📦必装 NuGet 包系统架构概览…

C语言中整数编码方式(原码、反码、补码)

在 C 语言中,原码、反码、补码的运算规则与其编码特性密切相关,核心差异体现在符号位是否参与运算、进位如何处理以及减法是否能转化为加法等方面。以下是三者的运算规则及特点分析(以 8 位整数为例,符号位为最高位)&a…

js二维数组如何变为一维数组

在 JavaScript 中,将二维数组转换为一维数组(扁平化)有多种方法,可根据数组结构复杂度、性能需求和兼容性选择。以下是最常用的实现方式: 1. 使用 flat() 方法(ES2019) MDN释义:flat…

Claude code在Windows上的配置流程

前言 昨天在服务器上配置好了 Claude code,发现其编码性能和效率都非常不错。 然而,尝试用它修改带 UI 界面的客户端程序时颇为不便,因为服务器没有图形化界面,无法直接将应用界面直接显示到开发机上,调试起来颇为不…

手把手教你用YOLOv10打造智能垃圾检测系统

无需编程基础!手把手教你用YOLOv10打造智能垃圾检测系统 垃圾分类不再难,AI助手秒识别 你是否曾站在分类垃圾桶前犹豫不决?塑料瓶是可回收还是其他垃圾?外卖餐盒到底该丢哪里?随着垃圾分类政策推广,这样的困…

batchnorm类

1. 伪代码:2. python代码:3. 测试:4. 加深理解:以 为例,x3,可见输出的batchnorm后y0.2627.查看模型记录的均值及方差,计算y0.286799,理解是大致这样的计算过程。(为什么数…

SpringBoot项目保证接口幂等的五种方法!

1. 幂等概述 1.1 深入理解幂等性 在计算机领域中,幂等(Idempotence)是指任意一个操作的多次执行总是能获得相同的结果,不会对系统状态产生额外影响。在Java后端开发中,幂等性的实现通常通过确保方法或服务调用的结果…

SQL新手入门详细教程和应用实例

SQL(Structured Query Language)是用于管理和操作关系型数据库的标准语言。它允许你创建、查询、更新和删除数据。本教程将从基础概念开始,逐步引导你上手SQL,并提供详细的应用实例。教程基于标准SQL语法,实际使用时需根据数据库系统(如MySQL、SQLite或PostgreSQL)调整。…

DVWA-LOW级-SQL手工注入漏洞测试(MySQL数据库)+sqlmap自动化注入-小白必看(超详细)

首次使用DVWA的靶场,咋们先从最低级别的LOW开始,因为之前玩过一下墨者学院,对sql注入有一点认识和理解,所以先从sql的盲注开始; 1、测试注入点是否存在sql注入的漏洞; (1)首先我们…

JAVA线程池详解+学习笔记

1.线程池基础概念线程池是一种资源复用技术,通过预先创建并管理一组线程,减少频繁创建和销毁线程的开销。核心思想与数据库连接池、字符串常量池类似,旨在提升系统性能。核心参数解析ThreadPoolExecutor构造函数包含7个关键参数:c…

数据分析库 Pandas

对于Pandas的简单认识和基本操作的练习一 介绍 Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的库。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于 Excel …

qt 中不要让 lambda 槽函数捕获信号源对象的共享指针

错误示例std::shared_ptr<QSerialPort> serial{new QSerialPort{}};QSerialPort::connect(serial.get(),&QSerialPort::readyRead,[serial](){QByteArray receive_data serial->readAll();std::cout.write(receive_data.data(), receive_data.size());});这会直接…

Solidity 合约的编写-完整开发流程:从编译、测试、部署到交互

&#x1f9f1; Solidity 合约开发全流程&#xff08;Foundry 版&#xff09;✅ 适合对象&#xff1a;已经能写合约但不清楚如何测试、部署、交互的开发者✅ 工具链&#xff1a;Foundry&#xff08;forge, anvil, cast&#xff09;&#x1f4cc; 开发流程总览1️⃣ 初始化项目 2…

设计模式 - 面向对象原则:SOLID最佳实践

文章目录深入理解 SOLID&#xff1a;用对原则&#xff0c;别把简单问题搞复杂SOLID 原则概览1. 单一职责原则&#xff08;SRP&#xff09;2. 开闭原则&#xff08;OCP&#xff09;3. 里氏替换原则&#xff08;LSP&#xff09;4. 接口隔离原则&#xff08;ISP&#xff09;5. 依赖…

Vue 3 中父组件内两个子组件相互传参的几种方法

方法一&#xff1a;通过父组件中转&#xff08;Props Emits&#xff09;<!-- ParentComponent.vue --> <template><ChildA :message-from-b"messageFromB" send-to-b"handleSendToB" /><ChildB :message-from-a"messageFromA&q…

三子棋游戏设计与实现(C 语言版)

一、需求分析目标&#xff1a;实现一个简单的人机对战三子棋&#xff0c;支持以下功能&#xff1a;初始化空棋盘&#xff0c;清晰展示落子状态。玩家通过坐标落子&#xff08;X 代表玩家&#xff09;&#xff0c;电脑随机落子&#xff08;O 代表电脑&#xff09;。实时判断胜负…

GD32 CAN1和TIMER0同时开启问题

背景&#xff1a;今天在一个项目调试的时候发现了一些问题&#xff0c;由此贴记录一下问题解决的过程。使用的芯片是GD32F305VE。使用到了CAN1和TIMER0。在使用这连个外设的时候发送了一些问题。单独使用CAN1。功能正常。单独使用TIMER0。配置为输出模式。功能正常。但是当两个…

剑指offer56_数组中唯一只出现一次的数字

数组中唯一只出现一次的数字在一个数组中除了一个数字只出现一次之外&#xff0c;其他数字都出现了三次。 请找出那个只出现一次的数字。 你可以假设满足条件的数字一定存在。 思考题&#xff1a; 如果要求只使用 O(n) 的时间和额外 O(1) 的空间&#xff0c;该怎么做呢&#xf…