中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用PHP解決的一個棧

發布時間:2021-09-02 10:38:39 來源:億速云 閱讀:131 作者:chen 欄目:開發技術

這篇文章主要介紹“怎么用PHP解決的一個棧”,在日常操作中,相信很多人在怎么用PHP解決的一個棧問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么用PHP解決的一個棧”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

前言

遇到一道面試題,題目大概意思如下:

使用兩個普通棧實現一個特殊棧,使得pop、push、min三個函數的都是復雜度為O(1)的操作,min函數是獲得當前棧的最小值。

初步想法

1.要實現min函數為(1)操作,當時第一想法是事先需要算好當前最小值,于是會想到用一個值來保存當前棧中最小值元素,然后push和pop操作的時候維護這個值。這樣min,push都是O(1)了,但pop可不是,如果當前彈出的是最小值,需要從新尋找當前元素的最小值,這個就不是o(1)了。

2.而且上面方法沒有用到另外一個棧,于是又想到:在一個棧中存儲排好序的元素,同樣在push和pop操作中維護這個有序堆棧,如圖:

怎么用PHP解決的一個棧

但是這樣的話min操作是O(1),但是push、pop操作因為要維護這個有序棧,怎么也想不到一個方法可以O(1)的復雜度。

當時覺得肯定是在另一個棧中緩存最小值信息,但是不知道是因為沒吃飯還是怎么地,思維就此僵住了。

正確解法

遇到問題解決不了,感覺心里很不爽,于是吃飯的時候又開始想怎么充分理由棧的特性,有效的緩存最小值信息,以便min操作使用。

棧操作最大的特性是只能操作棧頂元素,想到那用一個輔助棧緩存每次棧操作時的最小值,不是剛剛好。這樣每次pop操作的時候,兩邊一起彈出就可以;因為輔助棧的棧頂元素最當前棧中的最小值,push操作是也只需要比較入棧元素和輔助棧棧頂元素就可以。這樣push、pop、min都都O(1)操作了。如圖:

怎么用PHP解決的一個棧

文字可能沒說清楚,上代碼,下面是PHP的實現,通過數組來模擬堆棧。

<?php
/**
 * 使用一個輔助棧,O(1)復雜度求出棧中的最小數
 * @hack 類中通過數組來模擬堆棧
 * 
 * @author laiwenhui
 */
class strack{

  /**
   * 數據棧,存儲棧數據;
   *
   * @var array
   */
  private $_arrData = array();
  /**
   * 輔助棧,存儲數據組棧中每層的最下值信息;
   *
   * @var array
   */
  private $_arrMin = array();
  /**
   * 棧頂所在單元
   *
   * @var int
   */
  private $_top=-1;
  /**
   * 出棧
   * @return bool|int
   */
  public function pop(){
    if ($this->_top === -1){
      return false;
    }
    array_pop($this->_arrMin);
    $this->_top--;
    return array_pop($this->_arrData);
  }
  /**
   * 入棧
   * @param int $element
   * @return bool
   */
  public function push($element){
    $element = intval($element);
    //如果棧為空,直接入棧
    if ($this->_top === -1){
      array_push($this->_arrData, $element);
      array_push($this->_arrMin, $element);
      $this->_top++;
      return true;
    }
    //不為空,判斷入棧的值是否比最小棧棧頂小
    $min = $this->_arrMin[$this->_top];
    //比較求出最小值
    $currentMin = $element < $min ? $element : $min;
    //當前棧中最小值入棧
    array_push($this->_arrMin, $currentMin);
    //數據入棧
    array_push($this->_arrData, $element);
    $this->_top++;

    return true;
  }
  /**
   * 求當前棧空間的最小值
   * @return bool|int 
   */
  public function min(){
    if ($this->_top === -1){
      return false;
    }
    return $this->_arrMin[$this->_top];
  }
}

使用如下:

復制代碼 代碼如下:


$obj = new strack();
$obj->push(12);
$obj->push(56);
$obj->push(23);
$obj->push(89);
$obj->push(4);
var_dump($obj->min());
$obj->pop();
var_dump($obj->min());
$obj->push(8);
var_dump($obj->min());

輸出為:

復制代碼 代碼如下:


int(4)
int(12)
int(8)

OK,滿足要求。

到此,關于“怎么用PHP解決的一個棧”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

石门县| 神农架林区| 瑞安市| 赫章县| 中江县| 仲巴县| 南皮县| 亳州市| 辽源市| 滦平县| 容城县| 新源县| 怀来县| 儋州市| 淄博市| 城市| 湖北省| 萝北县| 秦皇岛市| 托克逊县| 万载县| 曲周县| 枣阳市| 吴忠市| 平顶山市| 神木县| 房产| 光泽县| 武宁县| 龙州县| 喜德县| 台湾省| 乡宁县| 忻州市| 锡林郭勒盟| 桐梓县| 三穗县| 乐业县| 六盘水市| 大英县| 渝北区|