データ構造の配列-初日の学習
配列はシーケンス構造の線形テーブルであり、すべての要素のメモリアドレスは連続している.
ダイナミック配列(Dynamic Array)インタフェース設計 に要素を追加 を返す を追加 を削除
次の操作を行います.
phpを用いて配列のデータ構造を実現し、初日の学習を記録し、データ構造の美しさを感じる.
ダイナミック配列(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; $isize; $i++){
$this->elements[$i-1] = $this->elements[$i];
}
$this->elements[--$this->size] = null;
return $old;
}
/**
*
*/
public function clear(){
for($i=0;$isize;$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;$isize;$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;$isize;$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を用いて配列のデータ構造を実現し、初日の学習を記録し、データ構造の美しさを感じる.