作为程序员一定要保持良好的睡眠,才能好编程

PHP实现顺序链表

发布时间:2018-11-30

php中,是实现顺序链表,


顺序链表的创建,需要先声明个数 。


如果超过个数后,再次插入数据,会 超出范围异常


此循序表 ,使用  splFiexArray 结构实现

<?php
/**
 * Created by PhpStorm.
 * User: songyongzhan
 * Date: 2018/11/30
 * Time: 11:02
 * Email: songyongzhan@qianbao.com
 */


class SeqList {

  const MAX = 80;


  private $max;


  private $num;

  /**
   * @var SplFixedArray
   */
  private $item;


  public function __construct($max = self::MAX) {

    $this->max = $max;
    $this->num = 0;
    $this->item = new SplFixedArray($this->max);
  }

  public function isEmpty() {
    return empty($this->num);
  }


  /**
   * 目前插入了多少数据
   * @return int
   */
  public function count() {
    return $this->num;
  }

  /**
   * 在尾部添加value值,根据顺序表添加
   * @param $value
   */
  public function append($value) {

    if ($this->isFull()) {
      printf("存储表已满" . PHP_EOL);
      return;
    }

    $this->item[$this->num] = $value;
    $this->num++;

  }


  /**
   * 判断这个元素是否存在
   * @param $index
   * @return bool
   */
  public function isExists($index) {
    return $this->item->offsetExists($index);
  }

  /**
   *
   */
  public function clear() {
    $this->__construct();
  }

  /**
   * @param $index
   * @param $val
   * @throws Exception
   */
  public function add($index, $val) {

    if (!is_numeric($index))
      throw new Exception('$index must be numeric');

    if ($index < 0 || $index > $this->max)
      throw new RuntimeException('$index 不能超过最大的值' . $this->max . ' 或不能小于0');


    for ($i = $this->num; $i > $index; $i--) {
      $this->item[$i] = $this->item[$i - 1];
    }

    $this->item[$index] = $val;
    $this->num++;
  }

  /**
   * @param $index
   * @throws Exception
   */
  public function delItem($index) {

    try {

      if (!is_numeric($index))
        throw new Exception($index);

      if ($index < 0 || $index >= $this->num)
        throw new RuntimeException($index);

    } catch (TypeError $e) {
      echo $e->getMessage();
    } catch (RuntimeException $e) {
      echo $e->getMessage();
    }

    for ($i = $index; $i < ($this->num - 1); $i++) {
      $this->item[$i] = $this->item[$i + 1];
    }
    $this->num--;

  }


  public function setItem($index, $val) {

    if (!is_numeric($index))
      throw new Exception($index);

    if ($index < 0 || $index >= $this->num)
      throw new RuntimeException($index);

    if ($index >= 0 && $index < $this->num) {
      $this->item[$index] = $val;
    }

    return TRUE;

  }

  public function getLocation($val) {

    for ($i = 0; $i < $this->num; $i++) {
      if ($this->item[$i] == $val)
        return $i;
    }

    return -1;

  }

  public function isFull() {

    if ($this->num >= $this->max)
      return TRUE;
    else return FALSE;

  }

  public function getList() {
    /* $data = [];
     for ($i = 0; $i < $this->num; $i++) {
       $data[$i] = $this->item[$i];
     }
     return $data;*/

    return $this->item->toArray();
  }


  public function getItem() {
    return $this->item;
  }

  /**
   *
   * @return int
   */
  public function getFiexArraySize() {
    return $this->item->getSize();
  }

  /**
   * @param $num
   * @return bool
   * @throws Exception
   */
  public function setFiexArraySize($num) {

    if (!is_numeric($num))
      throw new Exception('设置FiexArray值必须是数字');

    if ($num < 0)
      throw new RuntimeException('设置FiexArray值长度必须大于0');
    $this->max = $num;
    return $this->item->setSize($num);
  }

}


$seq = new SeqList(5);
$seq->setFiexArraySize(12);
$seq->append(1);
$seq->append(2);
$seq->append(3);
//$seq->append(4);
//$seq->append(5);
//$seq->append(6);
//

$seq->add(9, 10000);
//$seq->append(7);
$seq->append(8);
//$seq->append(9);
//$seq->append(10);

printf("index 9 是否存在:%s\n",$seq->isExists(9));

var_dump($seq->count());
//$seq->delItem(2);
//$seq->delItem(4);

$seq->add(2, 10);
// print_r($seq->clear());
print_r($seq->getList());


var_dump($seq->getFiexArraySize());


$sqlFixedArr = $seq->getItem();

var_dump($sqlFixedArr->getSize());


var_dump($seq->getLocation(9));