zoukankan      html  css  js  c++  java
  • 自己手写一个queuelink

    代码如下:

    <?php
     
    
    class QueueLink
    {
        private $first_key=0;//最前面的那个元素的键
        private $first_value=0;//最前面的那个元素的值
        private $last_key=0;//最后面的那个元素的键
        private $last_value=0;//最后面的那个元素的值
        private $index=0;//指定的指针
        private $length=0;//队列长度
        private $key_array=0;//队列键数组
        private $value_array=0;//队列值数组
    
        /**
         * QueueLink constructor.    [构造方法]
         * @param array $list        [要存储的数组列表]
         */
        public function __construct($list=array())
        {
            $length=count($list);
            if($length<1)
            {
                return false;//数量不够
            }
            $this->length=$length;//存储队列长度
            $this->key_array=array_keys($list);//存储键
            $this->value_array=array_values($list);//存储值
            $this->reset_first_last_key();
            $this->reset_first_last_value();
        }
    
        /**
         * 弹出第一个元素
         * @return array    [返回第一个元素的数组]
         */
        public function out_left_first()
        {
            //弹出最左边一个
            $first_key   = array_shift($this->key_array);//弹出第一个key
            $first_value = array_shift($this->value_array);//弹出第一个值
            $this->list_length_desc(1);//队列数量减少1个长度
            $this->reset_key_value_list();//重置键值
            return compact("first_key","first_value");//返回第一个元素的key和值
    
        }
    
        /**
         * 弹出最后一个元素
         * @return array    [返回最后一个元素的数组]
         */
        public function out_right_last()
        {
            //弹出最后边一个
            $last_key   = array_pop($this->key_array);//弹出第一个key
            $last_value = array_pop($this->value_array);//弹出第一个值
            $this->list_length_desc(1);//队列数量减少1个长度
            $this->reset_key_value_list();//重置键值
            return compact("last_key","last_value");//返回最后一个元素的key和值
        }
    
    
        /**
         * 返回第一个键
         * @return int    [返回第一个键]
         */
        public function get_first_key()
        {
            return $this->first_key;//获取首个key
        }
    
        /**
         * 返回第一个值
         * @return int    [返回第一个值]
         */
        public function get_first_value()
        {
            return $this->first_value;//获取首个值
        }
    
        /**
         * 返回最后一个键
         * @return int    [返回最后一个键]
         */
        public function get_last_key()
        {
            return $this->last_key;//获取最后一个key
        }
    
        /**
         * 返回最后一个值
         * @return int    [返回最后一个值]
         */
        public function get_last_value()
        {
            return $this->last_value;//获取最后一个值
        }
    
        /**
         * 重置键值列表
         */
        public function reset_key_value_list()
        {
            $this->reset_key_array();//重置键数组
            $this->reset_value_array();//重置值数组
            $this->reset_first_last_key();//重置第一个和最后一个键
            $this->reset_first_last_value();//重置第一个和最后一个值
        }
    
        /**
         * 重置第一个和最后一个key
         */
        public function reset_first_last_key()
        {
            $this->first_value=isset($this->value_array[0])?$this->value_array[0]:null;//获取第一个
            $this->last_value =isset($this->value_array[$this->length-1])?$this->value_array[$this->length-1]:null;//获取最后一个
        }
    
        /**
         * 重置第一个和最后一个值
         */
        public function reset_first_last_value()
        {
            $this->first_key=isset($this->key_array[0])?$this->key_array[0]:null;//获取第一个
            $this->last_key =isset($this->key_array[$this->length-1])?$this->key_array[$this->length-1]:null;//获取最后一个
        }
    
        /**
         * 重置键数组
         */
        public function reset_key_array()
        {
            $this->key_array=array_values($this->key_array);//key重置
        }
    
        /**
         * 重置值数组
         */
        public function reset_value_array()
        {
            $this->value_array=array_values($this->value_array);//value重置
        }
    
        /**
         * 将队列的数据长度进行自增
         * @param int $num    [对自减做自增]
         */
        public function list_length_add($num=1)
        {
            $this->length+=$num;
        }
    
        /**
         * 将队列的数据长度进行自减
         * @param int $num    [对自减做处理]
         */
        public function list_length_desc($num=1)
        {
            $this->length-=$num;
        }
    
        /**
         * 从数组中根据key返回数据
         * @param string $key        [要获取的key]
         * @param bool $is_delete    [是否要从队列中删除]
         * @return array|bool        [返回找到的数组]
         */
        public function get_data_by_key($key='',$is_delete=true)
        {
            //根据key得到数据 并且从数据队列中删除
            $find_position=array_search($key,$this->key_array);
            if($find_position===false)
            {
                //说明不在数组中 立即返回
                return false;//没有找到
            }
            //如果在key列表中
            $value=$this->value_array[$find_position];
            if($is_delete)
            {
                //要删除这个元素
                $this->remove_from_list_by_find_position($find_position);//从数组队列中移除这个key
            }
            return compact("key","value");
        }
    
        /**
         * 根据找到的位置移除该元素
         * @param int $find_position    [查找到的位置]
         */
    
        private function remove_from_list_by_find_position($find_position=0)
        {
            //移除元素
            if($find_position==0)
            {
                //说明是第一个
                $this->out_left_first();//第一个出队列
            }
            elseif($find_position==$this->length-1)
            {
                //说明是最后一个
                $this->out_right_last();//最后一个出队列
            }else
            {
                //说明既不是开始 又不是结尾 从中间找到的
                unset($this->key_array[$find_position]);//键数组去掉要找的元素
                unset($this->value_array[$find_position]);//值数组去掉要找的元素
                $this->list_length_desc(1);//队列数量减少1个长度
                $this->reset_key_value_list();//重置键值
            }
        }
    
    }
    
    $list=array(
        "id"=>"first",
        "name"=>"second",
        "pid"=>"third",
        "content"=>"fourth",
        "title"=>"fifth",
    );
    
    $obj   = new QueueLink($list);//实例化队列
    //var_dump($obj);
    $first = $obj->out_left_first();//左边第一个
    $last  = $obj->out_right_last();//右边最后一个
    
    
    //按照键取出某个数据
    $key="pid";
    $value=$obj->get_data_by_key($key,true);
    
    var_dump($first);
    var_dump($last);
    var_dump($value);
    var_dump($obj);
    ?>

    效果如图:

  • 相关阅读:
    奋力拼搏,永不言弃
    软件工程最终总结
    人生第一次JAVA编程,电梯(并不算完成版),以及IDEA里使用git
    尝试单元测试
    作业2的回答
    word count程序,以及困扰人的宽字符与字符
    关于未成品的问题:字符类型和其他种种
    随手一写,简单的四则运算练习
    浏览器缓存分析
    Codeforces Round #582 (Div. 3)
  • 原文地址:https://www.cnblogs.com/lizhaoyao/p/10620338.html
Copyright © 2011-2022 走看看