数组是一种顺序结构的线性表,所有元素的内存地址是连续的
动态数组(Dynamic Array)接口设计
size();
// 元素的数量isEmpty();
//是否为空contains(item);
// 是否包含某个元素add(E element);
// 添加元素到最后面get(int index);
// 返回 index 位置对应的元素set(int index,item);
// 设置index位置的元素add(int index,item);
// 往 index 位置添加元素remove(int index);
// 删除 index 位置对应的元素indexOf(item);
// 查看元素的位置clear();
// 清除所有元素
<?php
/**
* php实现数据结构 数组
* @size() 元素的数量
* @isEmpty() 是否为空
* @contains(item) 是否包含某个元素
* @add(item) // 添加一个元素到最后面
* @get(index) // 返回 index位置对应的元素
* @set(index,item) 设置index位置的元素
* @insert(index,item) 往 index 位置添加元素
* @remove(index) 删除index位置对应的元素
* @indexOf(item) 查看元素的位置
* @clear() 清除所有元素
*/
class ArrayList
{
private $size=0; // 元素的数量
private $elements=[]; // 所有的元素
private $capacity; // 当前数组的长度
const DEFAULT_CAPACITY=10; //数组默认长度
const ITEM_NOT_FOUND = -1 ; // 元素不存在的时候表示的数值索引
public function __construct(int $capacity=10)
{
$this->capacity = max(self::DEFAULT_CAPACITY,$capacity);
}
/**
* @return int
* 获取当前数组中元素的数量
*/
public function size():int
{
return $this->size;
}
/**
* @return bool
* 是否为空
*/
public function isEmpty():bool
{
return 0===$this->size;
}
/**
* 是否包含某个元素
* @param $item
* @return bool
*/
public function contains($item):bool
{
return $this->indexOf($item) != self::ITEM_NOT_FOUND;
}
/**
* @param $item
* 添加一个元素,在末尾
*/
public function add($item)
{
return $this->insert($this->size,$item);
}
/**
* @param int $index
* @return mixed
* 1,2,3,4 移除 索引为1的元素, 1,3,4。循环2次。从
*/
public function remove(int $index)
{
$this->rangeCheck($index);
$old = $this->elements[$index];
for($i=$index+1; $i<$this->size; $i++){
$this->elements[$i-1] = $this->elements[$i];
}
$this->elements[--$this->size] = null;
return $old;
}
/**
* 清除所有的元素
*/
public function clear(){
for($i=0;$i<$this->size;$i++){
$this->elements[$i] = null;
}
$this->size=0;
}
/**
* @param int $index
* @param $item
* 设置index位置的元素
* @return mixed
*/
public function set(int $index,$item)
{
$this->rangeCheck($index);
$old = $this->elements[$index];
$this->elements[$index] = $item;
return $old;
}
/**
* @param int $index
* @param $item
* 插入一个元素
* 1,3,4,5 在索引0处插入 2 得到 2,1,3,4,5
*插入索引处后的元素先向后移动,然后再插入新元素
* @return mixed
*/
public function insert(int $index,$item)
{
$this->rangeCheckForInsert($index);
// 数组长度进行扩容
for($i=$this->size;$i>$index;$i--){
$this->elements[$i] = $this->elements[$i-1];
}
$this->elements[$index] = $item;
$this->size++;
return $item;
}
/**
* @param int $index
* 获取index位置的元素
* @return mixed
*/
public function get(int $index)
{
$this->rangeCheck($index);
return $this->elements[$index];
}
/**
* @param $item
* 查看元素的索引
* @return int
*/
public function indexOf($item) :int
{
for($i=0;$i<$this->size;$i++)
if($this->elements[$i] === $item) return $i;
return self::ITEM_NOT_FOUND;
}
/**
* 保证容量足够
* @param int $capacity 当前元素的容量
*/
private function ensureCapacity(int $capacity){
$oldCapacity = count($this->elements);
if($this->capacity >= $capacity) return;
// 设置新容量
$this->capacity = $this->capacity + ($this->capacity>>1);
}
/**
* 异常抛出
* @param int $index
* @throws Exception
*/
private function outOfBoundsException(int $index){
throw new Exception("Index:{$index} , Size:{$this->size}");
}
private function rangeCheck(int $index)
{
if($index<0 || $index>=$this->size){
$this->outOfBoundsException($index);
}
}
private function rangeCheckForInsert(int $index){
if($index<0 || $index>$this->size){
$this->outOfBoundsException($index);
}
}
public function __toString()
{
$string = "size={$this->size},[";
for($i=0;$i<$this->size;$i++){
if(0!=$i) $string.=",";
$string.=$this->elements[$i];
}
$string.=']';
return $string;
}
}
$list = new ArrayList();
$list->add(1);
$list->add(2);
$list->add(3);
$list->insert(1,4);
$list->clear();
//var_dump((string)$list);
使用:
$list = new ArrayList();
$list->add(1);
$list->add(2);
$list->add(3);
$list->insert(1,4);
$list->clear();
使用php来实现数组的数据结构,记录第一天学习,感受数据结构之美.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。