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

news2024/12/26 0:08:40

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为null
        if (last == null){
            last = new Node(t,null);
            head.next = last;
        }else
        {
            // 当前尾结点last不为null
            Node oldLast = last;
            last = new Node<>(t, null);
            oldLast.next = last;
        }
        // 元素个数+1
        N++;
    }
    // 取出一个元素
    public T dequeue(){
        if (isEmpty()){
            return null;
        }

        Node oldFirst = head.next;
        head.next = oldFirst.next;
        N--;

        // 如果队列中没有元素了,那么需要重置last=null
        if (isEmpty()){
            last = null;
        }
        return (T) oldFirst.item;
    }


    @Override
    public Iterator<T> iterator() {
        return new QIterable();
    }

    private class  QIterable implements Iterator{
        private  Node n;

        public QIterable() {
            this.n = head;
        }

        @Override
        public boolean hasNext() {
            return n.next!=null;
        }

        @Override
        public 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;

        // 元素个数+1
        N++;
    }

    // 删除符号表中键位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;
            }
            // 变换n
            n = n.next;
        }
    }

    // 从符号表中获得键位key的对应值
    public Value get(Key key){
        // 找到键位key的节点,把该节点从链表中删除
        Node n = head;
        while (n.next != null){
            // 变换n
            n = n.next;
            // 判断n节点的键是否为key,如果是则替换
            if (n.key.equals(key)){
                return n.value;
            }
        }
        return null;
    }
}

4. 注意

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

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

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

相关文章

蓝桥杯【物联网】零基础到国奖之路:十二. TIM

蓝桥杯【物联网】零基础到国奖之路:十二. TIM 第一节 理论知识第二节 cubemx配置 第一节 理论知识 STM32L071xx器件包括4个通用定时器、1个低功耗定时器&#xff08;LPTIM&#xff09;、2个基本定时器、2个看门狗定时器和SysTick定时器。 通用定时器&#xff08;TIM2、TIM3、…

详解JavaScript中属性getter和setter

6.6 属性getter和setter 属性值可以用1个或者2个方法替代&#xff0c;getter和setter. 由这两个定义的属性称作存取器属性(accessor property)&#xff0c;不同于数据属性&#xff0c;只有一个简单的值。有读写属性&#xff0c;只能写&#xff0c;只能读&#xff0c;可以读写…

数据结构 算法的时间复杂度 计算(两种规则 加法原则+乘法原则)

在分析时间复杂性时&#xff0c;加法和乘法原则是两个基本且重要的概念&#xff0c;它们分别用于处理算法中顺序执行和嵌套执行的代码段的时间复杂度计算。以下是对这两个原则的详细说明&#xff1a; 一、加法原则 定义&#xff1a; 加法原则适用于顺序执行的代码段。如果一…

从Linux系统的角度看待文件-基础IO

目录 从Linux系统的角度看待文件 系统文件I/O open write read 文件操作的本质 vim中批量注释的方法 从Linux系统的角度看待文件 关于文件的共识&#xff1a; 1.空文件也要占用磁盘空间 2.文件内容属性 3.文件操作包括文件内容/文件属性/文件内容属性 4.文件路径文…

LDO实习报告(免费)-有完整电路版图

LDO实习任务书 实习目的&#xff1a; 了解LDO电路研究现状和原理结构&#xff0c;熟悉模拟电路设计流程。 week1 &#xff1a; 调研LDO应用情况及研究现状。 week2 &#xff1a; 熟悉LDO基本原理及组成。 week3 &#xff1a; 构建LDO电路。 week4 &#xff1a; 对LDO进…

从日志到洞察:轻松实现服务器安全管理的神器

在当今复杂多变的网络环境中&#xff0c;服务器安全管理已成为一项不可或缺的任务。然而&#xff0c;面对海量的日志数据&#xff0c;如何快速精准地提取有价值的信息&#xff0c;并及时发现潜在的安全威胁&#xff1f;本文将为您介绍一款强大的服务器日志检索与查杀工具&#…

pilz皮尔兹PSSuniversal分散控制平台 Dezentrale Steuerungsplattform 手测

pilz皮尔兹PSSuniversal分散控制平台 Dezentrale Steuerungsplattform 手测

WebAPI编程(第三天,第四天)

WebAPI编程&#xff08;第三天&#xff0c;第四天&#xff09; day03 - Web APIs1.1. 节点操作1.1.1 删除节点1.1.2 案例&#xff1a;删除留言1.1.3 复制&#xff08;克隆&#xff09;节点1.1.4 案例&#xff1a;动态生成表格1.1.5 创建元素的三种方式1.1.6 innerTHML和createE…

基于SSM+小程序的自习室选座与门禁管理系统(自习室1)(源码+sql脚本+视频导入教程+文档)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 1、管理员实现了首页、基础数据管理、论坛管理、公告信息管理、用户管理、座位管理等 2、用户实现了在论坛模块通过发帖与评论帖子的方式进行信息讨论&#xff0c;也能对账户进行在线充值…

深圳龙链科技:全球区块链开发先锋,领航Web3生态未来

【深圳龙链科技】是全球领先的Web3区块链技术开发公司&#xff0c;专注于为全球客户提供创新高效的区块链解决方案。 深圳龙链科技由币安资深股东携手香港领先的Web3创新枢纽Cyberport联袂打造&#xff0c;立足于香港这一国际金融中心&#xff0c;放眼全球&#xff0c;汇聚了华…

罕见,回复问询后闪电终止,业绩存下滑风险

《IPO魔女》认为&#xff0c;和美精艺利润低且大幅波动&#xff0c;报告期公司毛利率持续大幅下滑。而2023年同行业的上市公司均出现了业绩大幅下滑的情况&#xff0c;还未上市的和美精艺恐怕也存在业绩下滑的风险。此外&#xff0c;2020年至2022年&#xff0c;和美精艺研发投入…

Excel根据一个值匹配一行数据

根据一个值从一个表中匹配一行数据&#xff0c;例如从左边的表中找到指定姓名的所有行数据 使用VLOOKUP函数&#xff0c;参数&#xff1a; Lookup_value&#xff1a;需要搜索的值&#xff0c;单个值 Table_array&#xff1a;被搜索的区域&#xff0c;是个表 Col_index_num&…

JS数据类型类型转换

基本数据类型 JS中的数据类型由原始值和对象共同组成&#xff0c;原始值一共有七种原始值&#xff1a; 数值(Number)大整数(BigInt)字符串(String)布尔值(Boolean)空值(Null)未定义(Undefined)符号(Symbol) 数值和大整数 数值(Number):在js中所有的整数和浮点数都是number类型 …

【vue-router】用meta.keepAlive做缓存

网上大家都说按下面的写法 <keep-alive><router-view v-if"route.meta.keepAlive"></router-view> </keep-alive> <router-view v-if"!route.meta.keepAlive"></router-view>但是会报错 解决方法也没找到 最后换一…

23、Presidential

难度 中 目标 root权限 2个flag 基于virtualbox启动 题目提示枚举是你的朋友 kali 192.168.86.102 靶机 192.168.86.107 信息收集 端口扫描 tcp开启的端口就两个&#xff0c;稳妥起见扫了一些常见的端口看是否有UDP协议开放的端口。同时nmap在扫描80端口提示可能存在的tra…

OCR识别系统 YOLOv8 +Paddle 方案落地

YOLOv8 PaddleOCR 技术方案落地 Yolov8相关文档Step 1 证件模型的训练Step 2 Yolov8进行图片推理Step 3 PaddleOCR进行识别Step 4 整合Yolov8 PaddleOCR 进行OCR Yolov8相关文档 《yolov8 官方网站》 《Yolov8 保姆级别安装》 Ultralytics YOLOv8 是一款尖端的、最先进的 (S…

NASA数据集:ATLAS/ICESat-2 L3B 南极和北极网格陆地冰高,第 3 版

目录 简介 摘要 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 ATLAS/ICESat-2 L3B Gridded Antarctic and Arctic Land Ice Height V003 简介 ATLAS/ICESat-2 L3B 南极和北极网格陆地冰高&#xff0c;第 3 版 ATL14 和 ATL15 将 ATLAS/ICESat-2 L3B 年度陆地冰…

5 分钟快速入门 Github Action

Github Action 是一种自动化构建工具。 ‍ 介绍 什么是 GitHub Action&#xff1f;来看看阮一峰大佬的介绍&#xff1a; GitHub Actions 是 GitHub 的持续集成服务&#xff0c;于 2018 年 10 月推出。 大家知道&#xff0c;持续集成由很多操作组成&#xff0c;比如抓取代码、…

深度学习(入门)03:监督学习

1、监督学习简介 监督学习&#xff08;Supervised Learning&#xff09;是一种重要的机器学习方法&#xff0c;它的目标是通过“已知输入特征”来预测对应的标签。在监督学习中&#xff0c;每一个“特征-标签”对被称为样本&#xff08;example&#xff09;&#xff0c;这些样…

视觉分析在垃圾检测中的应用

随着城市化进程的加快&#xff0c;垃圾管理成为现代城市面临的重大挑战。有效的垃圾识别和分类不仅能提升环境保护的效率&#xff0c;还能减少资源浪费。基于视觉分析的垃圾识别算法应运而生&#xff0c;为解决这一问题提供了技术支持。 垃圾识别算法的技术实现主要依赖于深度学…