- 符号表最主要的目的就是将一个键和一个值联系起来,符号表能够将存储的数据元素是一个键和一个值共同组成的键值对数据,我们可以根据键来查找对应的值。
- 符号表中的键具有
唯一性
符号表实际应用
![在这里插入图片描述](https://img-blog.csdnimg.cn/61a379d68aaf420298a2f277ad384c98.png)
符号表API设计
节点类API
![在这里插入图片描述](https://img-blog.csdnimg.cn/0480ad936d2f49e58baf33df22151c43.png)
符号表API
![在这里插入图片描述](https://img-blog.csdnimg.cn/39aa076e6db345289deeee505872b0ef.png)
package symbol;
public class SymbolTable<Key,Value> {
private Node head;
private int N;
private class Node{
private Key key;
private Value value;
public Node next;
public Node(Key key, Value value, Node next) {
this.key = key;
this.value = value;
this.next = next;
}
}
public SymbolTable(){
this.head = new Node(null,null,null);
this.N = 0;
}
public int size(){
return N;
}
public void put(Key key,Value value){
Node n = head;
while (n.next!=null){
n = n.next;
if(n.key.equals(key)){
n.value = value;
return;
}
}
Node newNode = new Node(key, value, null);
Node oldFirst = head.next;
head.next = newNode;
newNode.next = oldFirst;
N++;
}
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;
}
}
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;
}
}
public static void main(String[] args) {
SymbolTable<Integer, String> symbolTable = new SymbolTable<>();
symbolTable.put(1,"乔峰");
symbolTable.put(2,"虚竹");
symbolTable.put(3,"段誉");
System.out.println(symbolTable.size());
symbolTable.put(1,"孙少聪");
System.out.println(symbolTable.size());
System.out.println(symbolTable.get(1));
symbolTable.delete(2);
System.out.println(symbolTable.size());
}
有序符号表
package symbol;
public class OrderSymbolTable<Key extends Comparable<Key>,Value> {
private Node head;
private int N;
private class Node{
private Key key;
private 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 pre = head;
Node curr = head.next;
while (curr != null && key.compareTo(curr.key)>0){
pre = curr;
curr = curr.next;
}
if (curr != null && key.compareTo(curr.key)==0){
curr.value = value;
return;
}
Node newNode = new Node(key, value, null);
pre.next = newNode;
newNode.next = curr;
N++;
}
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;
}
}
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;
}
}
public static void main(String[] args) {
OrderSymbolTable<Integer, String> symbolTable = new OrderSymbolTable<>();
symbolTable.put(1,"乔峰");
symbolTable.put(2,"虚竹");
symbolTable.put(4,"段誉");
symbolTable.put(3,"孙少聪");
}