数据结构之数组-第一天学习

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

动态数组(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(); // 清除所有元素
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来实现数组的数据结构,记录第一天学习,感受数据结构之美.

你可能感兴趣的:(php,数据结构)