符号表简介

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

符号表中,键具有唯一性。
符号表在实际生活中的使用场景是非常广泛的,见下表:

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

符号表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 N;public SymbolTable() {head = new Node(null,null,null);N=0;}//获取符号表中键值对的个数public int size(){return N;}//往符号表中插入键值对public void put(Key key,Value value){//先从符号表中查找键为key的键值对Node n = head;while(n.next!=null){n = n.next;if (n.key.equals(key)){n.value=value;return;}}//符号表中没有键为key的键值对Node oldFirst = head.next;Node newFirst = new Node(key,value,oldFirst);head.next = newFirst;//个数+1N++;}//删除符号表中键为key的键值对public void delete(Key key){Node n = head;while(n.next!=null){if (n.next.key.equals(key)){n.next = n.next.next;N--;return;}n = n.next;}}//从符号表中获取key对应的值public Value get(Key key){Node n = head;while(n.next!=null){n = n.next;if (n.key.equals(key)){return n.value;}}return null;}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 class Test {public static void main(String[] args) throws Exception {SymbolTable<Integer, String> st = new SymbolTable<>();st.put(1, "张三");st.put(3, "李四");st.put(5, "王五");System.out.println(st.size());st.put(1,"老三");System.out.println(st.get(1));System.out.println(st.size());st.delete(1);System.out.println(st.size());}
}

有序符号表

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

//有序符号表
public class OrderSymbolTable<Key extends Comparable<Key>,Value> {//记录首结点private Node head;//记录符号表中元素的个数private int N;public OrderSymbolTable() {head = new Node(null,null,null);N=0;}//获取符号表中键值对的个数public int size(){return N;}//往符号表中插入键值对public void put(Key key,Value value){//记录当前结点Node 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=value;return;}//3.没有找到相同的key,把新结点插入到curr之前Node newNode = new Node(key, value, curr);pre.next = newNode;}//删除符号表中键为key的键值对public void delete(Key key){Node n = head;while(n.next!=null){if (n.next.key.equals(key)){n.next = n.next.next;N--;return;}n = n.next;}}//从符号表中获取key对应的值public Value get(Key key){Node n = head;while(n.next!=null){n = n.next;if (n.key.equals(key)){return n.value;}}return null;}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 class Test {public static void main(String[] args) throws Exception {OrderSymbolTable<Integer, String> bt = new OrderSymbolTable<>();bt.put(4, "二哈");bt.put(3, "张三");bt.put(1, "李四");bt.put(1, "aa");bt.put(5, "王五");}
}

数据结构与算法之符号表相关推荐

  1. 数据结构和算法基础--线性表

    数据结构和算法基础–线性表 数据结构 = 数据的逻辑结构+数据的存储结构+数据的运算 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-28ek7MfI-164242629 ...

  2. 从零开始学数据结构和算法(二)线性表的链式存储结构

    链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...

  3. 黑马程序员 C语言数据结构与算法之线性表(链表/栈/队列/顺序表)

    C语言 链表基础知识清晰讲解(黑马) 讲的蛮好,就是音质不太好,有时听不清讲的啥! [黑马]数据结构与算法之线性表(链表/栈/队列/顺序表)[配套源码 嘛蛋,看错了,这是java的... 文章目录 链 ...

  4. rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)

    原文托管在Github: https://github.com/shellhub/blog/issues/52 数据结构与算法之线性表-顺序表实现(C语言版本) 前言 数据结构与算法是一个程序员必备的 ...

  5. 数据结构与算法(一) 线性表之顺序表

     线性表是一种最简单.最常用的数据结构,根据存储方式可以分为顺序表和链表.  顺序表: 顺序表指的是用一组地址连续的存储单元依次存储线性表的数据元素,称为线性表的顺序存储结构或顺序映像(sequent ...

  6. java数据结构与算法之顺序表与链表深入分析

    转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结 ...

  7. 数据结构和算法之——跳表

    之前我们知道,二分查找依赖数组的随机访问,所以只能用数组来实现.如果数据存储在链表中,就真的没法用二分查找了吗?而实际上,我们只需要对链表稍加改造,就可以实现类似"二分"的查找算法 ...

  8. 数据结构与算法之线性表(超详细顺序表、链表)

    原创公众号:bigsai 文章已收录在 全网都在关注的数据结构与算法学习仓库 欢迎star 前言 通过前面数据结构与算法基础知识我么知道了数据结构的一些概念和重要性,那么我们今天总结下线性表相关的内容 ...

  9. Java数据结构和算法:线性表

    线性表的定义 线性表(linear-list)是最常用最简单的一种数据结构.一个线性表是n (n≥0)个相同类型数据元素的有限序列.记为: L= (a1, a2 , - , an ). 其中,L是表名 ...

  10. Java数据结构与算法解析(一)——表

    本节我们讨论常见常用的数据结构--表. 如果要通俗简单的说什么是表,那我们可以这样说:按顺序排好的元素集合就是表. 表的概述 抽象数据类型是带有一组操作的一些对象的结合 1.定义: 线性表是一个线性结 ...

最新文章

  1. 判断字符串不包含某个字符php,java判断字符串是否包含某个字符的方法
  2. php删除指定对象的属性及属性值
  3. 怎样合理的将多个字符串拼接为一个字符串
  4. k近邻算法之 k值的选择
  5. Linux的10个游戏
  6. browsersync php,用browserSync吞下4个php
  7. 品《阿里巴巴大数据实践-大数据之路》一书(上)
  8. Day1:360培训学习重点笔记(7.13)
  9. 【免费毕设】ASP.NET基于.NET的城市公交查询系统的实现与设计(源代码+lunwen)
  10. 2014年DevExpress使用教程合集
  11. java 算法基础之三合并排序法
  12. 友华pt926g超级密码_获取电信PT926G光猫超级管理员及账号密码
  13. Chrome谷歌离线小恐龙更新了!奥运会版本来了!
  14. 环境微生物复习题及答案
  15. volatile(防止编译器对代码进行优化,常用于多线程环境中)
  16. 怎样把mysql的多张表汇总成一张表_sql如何将多个表合并成一个表
  17. 数学建模之线性回归的标准型以及例题
  18. stm32调试内存越界情况
  19. 知网、万方paperfree 查重的区别
  20. linux ipset 命令,什么是ipset,以及如何简单使用ipset,

热门文章

  1. 在BizTalk Server 2006 R2 中调用 WCF Services – Part 3
  2. 走近源码:Redis的启动过程
  3. Kotlin生态调查结果出炉:超过6成的开发者用过Kotlin了
  4. pgpool-II3.1 的内存泄漏(五)
  5. 风险案例-24期-缺少严格的变更及版本控制流程,导致问题反复,调试工作量和时间增加...
  6. Red hat linux ping: unknown host www.baidu.com
  7. 客户端工具收取邮件提示-ERR maildrop alredy locked
  8. Template Power
  9. 27.yii2 商城
  10. 14.各种所需内存计算