(JAVA)队列 和 符号表 两种数据结构的实现

1. 队列

1.1 队列的概述

队列是一种基于先进先出(FIFO)的数据结构,是一种只能在一端进行插入,在另一端进行删除操作的特殊线性表。

它按照先进先出的原则存储数据,先进入的数据,在读取时先被读出来

在这里插入图片描述

1.2 队列的API设计

类名Queue
构造方法Queue():创建Queue对象
成员方法1. public boolean isEmpty():判断队列是否为空,时返回true,否返回false
2. public int size():获取队列中元素的个数
3. public T dequeue():从队列中拿出一个元素
4. public void enqueue(T t):往队列中插入一个元素
成员变量1. private Node head:记录首节点
2. private int N:当前栈的元素个数
3. private Node last:记录最后一个节点
成员内部类private class Node:节点类

1.3 队列的实现

package com.renexdemo.linear;import java.util.Iterator;// 队列
public class Queue<T> implements Iterable<T> {private Node head;private Node last;private int N;// 节点类private static class Node<T>{public T item;// 存储元素public Node next;// 指向下一个节点public Node(T item, Node next) {this.item = item;this.next = next;}}// 初始化构造public Queue() {this.head = new Node(null,null);this.last = null;this.N = 0;}// 判断为空public boolean isEmpty(){return N==0;}// 获得队列的长度public int size(){return N;}// 填入一个元素public void enqueue(T t){// 当前尾结点last为nullif (last == null){last = new Node(t,null);head.next = last;}else{// 当前尾结点last不为nullNode oldLast = last;last = new Node<>(t, null);oldLast.next = last;}// 元素个数+1N++;}// 取出一个元素public T dequeue(){if (isEmpty()){return null;}Node oldFirst = head.next;head.next = oldFirst.next;N--;// 如果队列中没有元素了,那么需要重置last=nullif (isEmpty()){last = null;}return (T) oldFirst.item;}@Overridepublic Iterator<T> iterator() {return new QIterable();}private class  QIterable implements Iterator{private  Node n;public QIterable() {this.n = head;}@Overridepublic boolean hasNext() {return n.next!=null;}@Overridepublic Object next() {n = n.next;return n.item;}}}

2. 无序符号表

2.1 符号表的概述

符号表最重要的目的就是将一个键和一个值联系起来,符号表能够将存储的数据元素是一个键和一个值共同组成的键值对数据,我们可以根据键来查找对应的值,说白了,就是以键值对形式存储

在这里插入图片描述

符号表中,键具有唯一性

符号表在实际生活中的使用常见是非常广泛的,见下表:

应用查找目的
字典找出单次的释义单词释义
图书索引找出某个术语相关的页码术语一串页码
网络搜索找出某个关键字对应的网页关键字网页名称

2.2 符号表API设计

节点类:

类名Node<Key,Value>
构造方法Node(Key key,Value value,Node next):创建Node对象
成员变量1. public Key key:存储键
2. public Value value:存储值
3. public Node next:存储下一个节点

符号表:

类名SymbolTable<Key,Value>
构造方法SymbolTable():创建SymbolTable对象
成员方法1. public Value get(Key key):根据键key找到对应的值
2. public void put(Key key,Value value):向符号表中插入一个键值对
3. public void delete(Key key):删除键为key的键值对
4. public int size():获取符号表的大小
成员变量1. private Node head:记录首节点
2. private int N:记录符号表中键值对的个数

3. 有序符号表

当需要实现排序功能时,那么无序符号表将无法实现,这时就需要有序符号表

在这里插入图片描述

3.1 实现代码

package com.renexdemo.symbol;// 有序符号表
public class OrderSymbolTable<Key extends Comparable<Key>,Value> {private Node head;private int N;// 节点类private class Node{public Key key;public Value value;public Node next;public Node(Key key, Value value, Node next) {this.key = key;this.value = value;this.next = next;}}// 初始化类public OrderSymbolTable() {this.head = new Node(null,null,null);this.N = 0;}// 获得当前符号表中元素的个数public int size(){return N;}// 往符号表中添加键值对public void put(Key key,Value value){// 定义两个Node变量,分别记录当前节点和当前节点的上一个节点Node curr = head.next;Node pre = head;while (curr != null && key.compareTo(curr.key)>0){// 变换当前节点和前一个节点即可pre = curr;curr = curr.next;}// 如果当前节点curr的key和要插入的key一样,则替换if (curr != null && key.compareTo(curr.key) ==0){curr.value = value;return;}// 如果不一样,把新节点插入到curr之前Node node = new Node(key, value, curr);pre.next = node;// 元素个数+1N++;}// 删除符号表中键位key的键值对public void delete(Key key){// 找到键位key的节点,把该节点从链表中删除Node n = head;while (n.next != null){// 判断n节点的键是否为key,如果是则替换if (n.next.key.equals(key)){n.next = n.next.next;N--;return;}// 变换nn = n.next;}}// 从符号表中获得键位key的对应值public Value get(Key key){// 找到键位key的节点,把该节点从链表中删除Node n = head;while (n.next != null){// 变换nn = n.next;// 判断n节点的键是否为key,如果是则替换if (n.key.equals(key)){return n.value;}}return null;}
}

4. 注意

如果有初上手小白看代码,请别想的那么复杂。删除或添加(弹栈、压栈、入队、离队这种)可以说就是更改了指向的下一个节点。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【anki】显示 “连接超时,请更换网络后重试” 怎么办

文章目录 前言一、问题描述二、解决方案 前言 在 anki同步 时遇到的问题 一、问题描述 二、解决方案 从电信换为了移动热点&#xff0c;电脑手机都同步成功了

图像超分辨率(SR)

图像超分辨率&#xff08;Image Super-Resolution, SR&#xff09;是一种图像处理技术&#xff0c;旨在从低分辨率&#xff08;LR&#xff09;图像中恢复出高分辨率&#xff08;HR&#xff09;图像。这种技术通过增加图像中的细节和清晰度来提高图像的视觉质量&#xff0c;从而…

Stable Diffusion扩散模型【详解】新手也能看懂!!

前言 文章目录 1、Diffusion的整体过程2、加噪过程 2.1 加噪的具体细节2.2 加噪过程的公式推导 3、去噪过程 3.1 图像概率分布 4、损失函数5、 伪代码过程 此文涉及公式推导&#xff0c;需要参考这篇文章&#xff1a; Stable Diffusion扩散模型推导公式的基础知识 1、Diffu…

数据结构 ——— 顺序表oj题:编写函数,删除有序数组中的重复项

目录 题目要求 代码实现 题目要求 一个升序排列的数组 nums &#xff0c;要求原地删除重复出现的元素&#xff0c;使每个元素只出现一次&#xff0c;并返回删除后数组的新长度&#xff0c;元素的相对顺序应该保持一致 代码实现 代码演示&#xff1a; int removeDuplicate…

你要的Air201录音和播放录音功能?直接拿去!

最近拼拼收到同学们的疑问&#xff1a;Air201是否支持录音、播放录音功能&#xff1f; 必须支持&#xff01;Air201可是高集成化设计&#xff0c;并且Air201自带了ES8311音频解码芯片&#xff08;Audio Codec&#xff09;及MIC麦克&#xff0c;可支持本地的录音功能&#xff1…

SAP Message - self-explanatory 自身说明

SAP Message 解释、创建和应用可见如下文章&#xff1a;SAP Abap】SE91 - SAP MESSAGE 消息类创建与应用-CSDN博客 SE91 SAP消息类型 - tongxiaohu - 博客园 这里主要想聊一下常用的SE91 中不常用的功能 - 自身说明 选项的作用。 以 VF - 004 为例&#xff1a; 我们都知道自…

《凡人歌》中的IT职业启示录

《凡人歌》是由中央电视台、正午阳光、爱奇艺出品&#xff0c;简川訸执导&#xff0c;纪静蓉编剧&#xff0c;侯鸿亮任制片&#xff0c;殷桃、王骁领衔主演&#xff0c;章若楠、秦俊杰、张哲华、陈昊宇主演的都市话题剧 &#xff0c;改编自纪静蓉的小说《我不是废柴》。该剧于2…

上位机通讯汇川Plc3U和5U

开发过程中需要调用到汇川官网的两个动态库(ModbusTcpAPI.dll&#xff1b;StandardModbusApi.dll) 解压完成后找到上面的动态库复制到自己项目的根目录下面然后就可以进行下一步操作了 UI界面&#xff1a; 通讯类集成了3U和5U的连接断开以及读写方法&#xff1a; public clas…

如何巧妙运用Shell变量:掌握脚本编程的核心技巧

目录 前言一、Shell变量——变量类型1、用户自定义变量2、环境变量用./ 启动脚本文件记得加权限哦 二、Shell变量——变量赋值和访问(一&#xff09;变量定义(二&#xff09;变量的使用(三&#xff09;删除变量(四&#xff09;添加环境变量(五&#xff09;内部变量(六&#xff…

开源链动2+1模式AI智能名片小程序源码:放大特色,构建独特竞争力

摘要&#xff1a;本文探讨在当今社会背景下&#xff0c;开源链动21模式AI智能名片小程序源码如何通过坚持与众不同来构建独特竞争力。在信息传播便捷但个体易同质化的时代&#xff0c;拥有特色是脱颖而出的关键&#xff0c;而这种模式下的小程序源码具有独特的发展潜力。 一、引…

有效解决配置管理混乱,麒麟桌面操作系统V10 sp1 2403最新版本推出统一配置系统

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 当前桌面操作系统中可通过配置定义的应用有限&a…

使用 Git 帮助文档

聊聊如何更好地查阅官方文档。 ‍ git help 学习某个工具&#xff0c;官方文档是少不了的&#xff0c;也是最权威的。我们可以使用 git help 来查看帮助&#xff0c;该命令会列举出常用的命令和介绍&#xff1a; > git help usage: git [--version] [--help] [-C <pa…

十一假期地区人流量出行大数据分析:技术驱动下的深度洞察

随着国庆黄金周的临近&#xff0c;旅游市场再次迎来了一年一度的出行高峰。在这个数字化时代&#xff0c;如何利用大数据、第三方接口等先进技术进行数据采集与分析&#xff0c;以更精准地预测人流量、优化资源配置、提升旅游体验&#xff0c;成为了行业内外关注的焦点。 一、…

VGA/HDMI/DP接口和USB、串口通信协议

1、视频接口 开始之前我们先聊一聊数字信号和模拟信号&#xff0c;模拟信号和数字信号的不同之处在于它们所传输的信息的形式。模拟信号是一个连续的信号&#xff0c;可以以在无限小的时间内进行测量。数字信号则是以离散的形式进行传输&#xff0c;它的数值只能是离散的、有限…

net core mvc 数据绑定 《1》

其它的绑定 跟net mvc 一样 》》MVC core 、framework 一样 1 模型绑定数组类型 2 模型绑定集合类型 3 模型绑定复杂的集合类型 4 模型绑定源 》》》》 模型绑定 使用输入数据的原生请求集合是可以工作的【request[],Querystring,request.from[]】&#xff0c; 但是从可读…

Python 从入门到实战30(高级文件的操作)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了操作目录的相关知识。今天我们将学习一下高级文…

MySQl查询分析工具 EXPLAIN ANALYZE

文章目录 EXPLAIN ANALYZE是什么Iterator 输出内容解读EXPLAIN ANALYZE和EXPLAIN FORMATTREE的区别单个 Iterator 内容解读 案例分析案例1 文件排序案例2 简单的JOIN查询 参考资料&#xff1a;https://hackmysql.com/book-2/ EXPLAIN ANALYZE是什么 EXPLAIN ANALYZE是MySQL8.…

SSM+Vue社区物业管理系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质创作…

高级前端进阶:揭秘 MemFire Cloud 的强大助力

在前端开发的道路上&#xff0c;我们总是在追求效率与速度的平衡&#xff0c;如何写出优雅的代码&#xff0c;如何让开发流程更加顺滑成为了每个前端开发者的目标。对于那些希望提升效率、减少繁琐开发步骤的开发者来说&#xff0c;MemFire Cloud&#xff0c;一款国产的一站式应…

Java生成Markdown格式内容

前一篇写的是markdown格式的文本内容转换保存为word文档&#xff0c;是假定已经有一个现成的markdown格式的文本&#xff0c;然后直接转换保存为word文档&#xff0c;不过在开发中&#xff0c;通常情况下&#xff0c;数据是从数据库中获取&#xff0c;拿到的数据映射到java对象…