数组是一种顺序结构的线性表,所有元素的内存地址是连续的

动态数组(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来实现数组的数据结构,记录第一天学习,感受数据结构之美.


Theday
6 声望0 粉丝