PHP實現一個雙向隊列

來源:互聯網
上載者:User
PHP雙向隊列是什嗎?利用PHP寫一個雙向隊列,其實就是在考察PHP中幾個內建數組的函數。下面我們就來看一看具體的代碼。

用PHP寫一個雙向隊列<?php     class Deque{        public $queue = array();        /**         * 尾部入對         * @param [type] $value [description]         */        public function addLast($value){            return array_push($this->queue,$value);        }        /**         * 尾部出隊         * @return [type] [description]         */        public function removeLast(){            return array_pop($this->queue);        }        /**         * 頭部入隊         * @param [type] $value [description]         */        public function addFirst($value){            return array_unshift($this->queue, $value);        }        /**         * 頭部出隊         * @return [type] [description]         */        public function removeFirst(){            return array_shift($this->queue);        }        /**         * 清空隊列         * @return [type] [description]         */        public function makeEmpty(){            unset($this->queue);        }        /**         * 擷取列頭         * @return [type] [description]         */        public function getFirst(){            return reset($this->queue);        }        /**         * 擷取列尾         * @return [type] [description]         */        public function getLast(){            return end($this->queue);        }        /**         * 擷取長度         * @return [type] [description]         */        public function getLength(){            return count($this->queue);        }    } ?>加上一些限制條件後:<?php /** php 雙向隊列。支援限定隊列長度,輸入受限,輸出受限,及輸出必須與輸入同端幾種設定 *  Func: *  public frontAdd   前端入列 *  public frontRemove 前端出列 *  public rearAdd   後端入列 *  pulbic rearRemove  後端出列 *  public clear    清空對列 *  public isFull    判斷對列是否已滿 *  private getLength  擷取對列長度 *  private setAddNum  記錄入列,輸出依賴輸入時調用 *  private setRemoveNum 記錄出列,輸出依賴輸入時調用 *  private checkRemove 檢查是否輸出依賴輸入 */ class DEQue{ // class start   private $_queue = array(); // 對列   private $_maxLength = 0;  // 對列最大長度,0表示不限   private $_type = 0;    // 對列類型   private $_frontNum = 0;  // 前端插入的數量   private $_rearNum = 0;   // 後端插入的數量   /** 初始化   * @param $type    對列類型   *          1:兩端均可輸入輸出   *          2:前端只能輸入,後端可輸入輸出   *          3:前端只能輸出,後端可輸入輸出   *          4:後端只能輸入,前端可輸入輸出   *          5:後端只能輸出,前端可輸入輸出   *          6:兩端均可輸入輸出,在哪端輸入只能從哪端輸出   * @param $maxlength 對列最大長度   */  public function __construct($type=1, $maxlength=0){     $this->_type = in_array($type, array(1,2,3,4,5,6))? $type : 1;     $this->_maxLength = intval($maxlength);   }   // 前端入列   // @param Mixed  $data 資料   //@return boolean   public function frontAdd($data=null){     if($this->_type==3){ // 前端輸入限制       return false;     }     if(isset($data) && !$this->isFull()){       array_unshift($this->_queue, $data);       $this->setAddNum(1);       return true;     }     return false;   }   //前端出列   //@return Array  public function frontRemove(){     if($this->_type==2){ // 前端輸出限制       return null;     }     if(!$this->checkRemove(1)){ // 檢查是否依賴輸入       return null;     }     $data = null;     if($this->getLength()>0){       $data = array_shift($this->_queue);       $this->setRemoveNum(1);     }     return $data;   }   // 後端入列   // @param Mixed  $data 資料   //@return boolean   public function rearAdd($data=null){     if($this->_type==5){ // 後端輸入限制       return false;     }     if(isset($data) && !$this->isFull()){       array_push($this->_queue, $data);       $this->setAddNum(2);       return true;     }     return false;   }   // 後端出列   // @return Array   public function rearRemove(){     if($this->_type==4){ // 後端輸出限制       return null;     }     if(!$this->checkRemove(2)){ // 檢查是否依賴輸入       return null;     }     $data = null;     if($this->getLength()>0){       $data = array_pop($this->_queue);       $this->setRemoveNum(2);     }     return $data;   }   //清空對列   //@return boolean   public function clear(){     $this->_queue = array();     $this->_frontNum = 0;     $this->_rearNum = 0;     return true;   }  //判斷對列是否已滿   //@return boolean   public function isFull(){     $bIsFull = false;     if($this->_maxLength!=0 && $this->_maxLength==$this->getLength()){       $bIsFull = true;     }     return $bIsFull;   }   //擷取當前對列長度   //@return int   private function getLength(){     return count($this->_queue);   }   //記錄入列,輸出依賴輸入時調用   // @param int $endpoint 端點 1:front 2:rear   private function setAddNum($endpoint){     if($this->_type==6){       if($endpoint==1){         $this->_frontNum ++;       }else{         $this->_rearNum ++;       }     }   }   //記錄出列,輸出依賴輸入時調用   //@param int $endpoint 端點 1:front 2:rear   private function setRemoveNum($endpoint){     if($this->_type==6){       if($endpoint==1){         $this->_frontNum --;       }else{         $this->_rearNum --;       }     }   }  //檢查是否輸出依賴輸入   //@param int $endpoint 端點 1:front 2:rear   private function checkRemove($endpoint){     if($this->_type==6){       if($endpoint==1){         return $this->_frontNum>0;       }else{         return $this->_rearNum>0;       }     }     return true;   } } // class end ?>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.