这篇文章主要介绍如何实现 映射(Map),映射是一个存储(键,值)数据对的数据结构(key-value),它的特点是根据键(key)去寻找值(value),下面主要介绍如何使用 链表 去实现 映射(Map)和使用 二分搜索树(Binary Search Tree) 去实现 映射(Map)。
1.基于链表的映射(Map)实现
1.1 节点定义/**
* 映射节点定义
* Class Node
*/
class Node
{
public $key;
public $value;
public $next;
public function __construct($key, $value, $next) {
$this->key = $key;
$this->value = $value;
$this->next = $next;
}
}
1.2 LinkedListMap 类
这是一个基于链表实现的映射(Map)类,里面有 add($key,$value)方法向链表添加 key-value 键值对,contains($key)方法判断映射(Map)中是否包含 $key 对应的 key-value 键值对,set($key, $value)方法可以更新 key-value 键值对中的 value值,remove($key)方法可以删除 key 等于 $key 对应的 key-value 键值对。<?php
require 'Map.php';
/**
* 基于链表的映射(Map)实现
* Class LinkedListMap
*/
class LinkedListMap implements Map
{
public $dummyHead;
public $size;
public function __construct() {
$this->dummyHead = new Node(null, null, null);
$this->size = 0;
}
/**
* 向链表添加数据
* @param $key
* @param $value
*/
public function add($key, $value): void {
$node = $this->getNode($key);
if ($node == null) {
$this->dummyHead->next = new Node($key, $value, $this->dummyHead->next);
$this->size++;
} else {
$node->value = $value;
}
}
/**
* 判断 Map 是否包含 key
* @param $key
* @return bool
*/
public function contains($key): bool {
$node = $this->getNode($key);
if ($node == null) {
return false;
}
return true;
}
public function get($key) {
$node = $this->getNode($key);
return $node ?? null;
}
public function set($key, $value) {
$node = $this->getNode($key);
if (