数据结构与算法——符号表API设计及有序符号表设计

Java学习手册+面试指南:https://javaxiaobear.cn

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

符号表中,键具有唯一性。

符号表的应用:

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

1、符号表的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 val):向符号表中插入一个键值对
    3.public void delete(Key key):删除键为key的键值对
    4.public int size():获取符号表的大小
    成员变量1.private Node head:记录首结点
    2.private int N:记录符号表中键值对的个数
public class SymbolTable<Key,Value> {//头结点private Node head;//长度private int size;public SymbolTable() {head = new Node(null,null,null);size = 0;}/*** :根据键key,找对应的值* @param key* @return*/public Value get(Key key){Node<Key,Value> n = head;while(n.next != null){n = n.next;if(n.key.equals(key)){return n.value;}}return null;}/*** 向符号表中插入一个键值对* @param key* @param val*/public void put(Key key,Value val){Node<Key,Value> pre = head;while(pre.next != null){pre = pre.next;if(pre.key.equals(key)){pre.value = val;return;}}Node oldFirst = head.next;Node<Key, Value> node = new Node<>(key, val, oldFirst);head.next = node;size++;}/*** 删除键为key的键值对<br/>* @param key*/public void delete(Key key){Node n = head;while(null != n.next){if(n.next.key.equals(key)){n.next = n.next.next;size--;return;}n = n.next;}}/*** 获取符号表的大小* @return*/public int size(){return size;}private class Node<Key,Value>{Key key;Value value;Node next;public Node(Key key, Value value, Node next) {this.key = key;this.value = value;this.next = next;}}
}

2、有序符号表

刚才实现的符号表,我们可以称之为无序符号表,因为在插入的时候,并没有考虑键值对的顺序,而在实际生活中,有时候我们需要根据键的大小进行排序,插入数据时要考虑顺序,那么接下来我们就实现一下有序符号表。

package com.xiaobear.SymbolTable;/*** @Author xiaobear* @date 2021年07月30日 10:00* @Description 符号表*/
public class OrderSymbolTable<Key extends Comparable<Key>,Value> {//头结点private Node head;//长度private int size;public OrderSymbolTable() {head = new Node(null,null,null);size = 0;}/*** :根据键key,找对应的值* @param key* @return*/public Value get(Key key){Node<Key,Value> n = head;while(n.next != null){n = n.next;if(n.key.equals(key)){return n.value;}}return null;}/*** 向符号表中插入一个键值对* @param key* @param val*/public void put(Key key,Value val){Node<Key,Value> curr = head.next;//记录上一个节点Node pre = head;//1.如果key大于当前结点的key,则一直寻找下一个结点while(curr!=null && key.compareTo(curr.key)>0){pre = curr;curr = curr.next;}//2.如果当前结点curr的key和将要插入的key一样,则替换if (curr!=null && curr.key.compareTo(key)==0){curr.value = val;return;}//3.没有找到相同的key,把新结点插入到curr之前Node newNode = new Node(key, val, curr);pre.next = newNode;size++;}/*** 删除键为key的键值对<br/>* @param key*/public void delete(Key key){Node n = head;while(null != n.next){if(n.next.key.equals(key)){n.next = n.next.next;size--;return;}n = n.next;}}/*** 获取符号表的大小* @return*/public int size(){return size;}private class Node<Key,Value>{Key key;Value value;Node next;public Node(Key key, Value value, Node next) {this.key = key;this.value = value;this.next = next;}}
}

在这里插入图片描述

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

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

相关文章

c语言内嵌汇编知识点记录

内容在飞书云文档&#xff0c;点击打开即可。 Docshttps://r0dhfl3ujy9.feishu.cn/docx/EaVIdjGVeoS6fUxiKWkcjAq8nWg?fromfrom_copylink

PHP与Angular详细对比 帮助你选择合适的项目技术

开发可有效扩展并提供诺克斯堡级安全性的Web应用程序和网站是每个开发人员的梦想。而使用这样的产品是每个用户的愿望。因此&#xff0c;为您的项目选择最合适和可靠的技术非常关键。 虽然PHP和Angular是完全不同的技术——PHP与JavaScript是一个更恰当的比较——但它们都广泛…

【大数据Hive】hive 运算符使用详解

目录 一、前言 二、hive 运算符分类 三、hive 运算符操作演示 3.1 数据准备 创建表dual 加载一个文件dual.txt到dual表中 模拟测试 3.2 关系运算符 is null空值判断 is not null 非空值判断 like使用 3.3 算术运算符 取整操作 取余操作: % 位与操作: & …

2023-12-23 LeetCode每日一题(移除石子使总数最小)

2023-12-23每日一题 一、题目编号 1962. 移除石子使总数最小二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数数组 piles &#xff0c;数组 下标从 0 开始 &#xff0c;其中 piles[i] 表示第 i 堆石子中的石子数量。另给你一个整数 k &#xff0c;请你执行下述…

关于镜头景深的计算

1、问题背景 在调试项目的过程中&#xff0c;我们需要知道所搭配镜头的对焦距离、景深范围是多少&#xff0c; 这属于基本的项目信息&#xff0c;很多时候往往就因为忽略了这些小的信息&#xff0c;而导致一系列问题。 比如之前调试的一款化妆镜的设备&#xff0c;客户反馈了…

Pytest 项目结合Jenkins

一、window安装centos7虚拟机 参考网上其他教程 二、Linux安装Jenkins 进入jenkins.io网址&#xff0c;点击download&#xff0c;选择CentOS版本 1、Linux中安装java环境和git Jenkins的运行需要java环境&#xff1b;安装git是为代码上传给仓库做准备&#xff1b; yum - y…

MySQL8.0 ROW_NUMBER 调用案例

ROW_NUMBER()是一个窗口函数或分析函数&#xff0c;它为从1开始应用的每一行分配一个序号。 创建表和生成所需要的数据 CREATE TABLE chapter11 ( shopname VARCHAR(255) NULL, sales VARCHAR(255) NULL, sale_date DATE NULL ); INSERT INTO chapter11 (shopname, sales, sal…

【编译原理】期末预习做题向I

新的一年希望可以成为更好的人嘿嘿&#xff01; 这一篇基本就是把 up 讲的题都截了一遍然后加了点自己的笔记啥的 O.o &#xff08;不妥的话会删掉的 qwq&#xff0c;希望没事嘿嘿&#xff09; 来源&#xff1a;混子速成 I. 绪论 记住组成部分 II. 前后无关文法和语言 1.…

软件测试/测试开发丨Python 常用第三方库 pymysql

pymysql 概述 Python 的数据库接口标准是 Python DB-APIPyMySQL 是从 Python 连接到 MySQL 数据库服务器的接口PyMySQL 的目标是成为 MySQLdb 的替代品官方文档&#xff1a;pymysql.readthedocs.io/ pymysql 安装 使用 pip 安装使用 Pycharm 界面安装 pip install pymysqlp…

Spring高手之路-Spring事务的传播机制(行为、特性)

目录 含义 七种事务传播机制 1.REQUIRED&#xff08;默认&#xff09; 2.REQUIRES_NEW 3.SUPPORTS 4.NOT_SUPPORTED 5.MANDATORY 6.NEVER 7.NESTED 含义 Spring事务的传播机制是指在多个事务方法相互调用时&#xff0c;如何处理这些事务的传播行为。对应七种事务传播行为…

【Vue2+3入门到实战】(17)VUE之VueCli脚手架自定认创建项目、ESlint代码规范与修复、 ESlint自动修正插件的使用 详细示例

目录 一、本节内容二、VueCli 自定义创建项目三、ESlint代码规范及手动修复1.JavaScript Standard Style 规范说明2.代码规范错误3.手动修正 四、通过eslint插件来实现自动修正 一、本节内容 VueCli脚手架自定认创建项目ESlint代码规范与修复ESlint自动修正插件 二、VueCli 自…

爱吃饼干的小白鼠2023年终总结

目录 前言 学习生活经历 回顾2023 参加活动 回顾点点滴滴 展望2024 2024年新的起点和目标 前言 大家好&#xff0c;我是爱吃饼干的小白鼠。今天刚好是2024年1月1日&#xff0c;时间飞逝&#xff0c;2023年过的飞快&#xff0c;我已经入驻CSDN有一年了&#xff0c;这一年…