用PHP解決的乙個棧的面試題

2022-10-06 12:00:14 字數 2050 閱讀 3809

前言

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

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

初步想法

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

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

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

當時覺得肯定是在另乙個棧中快取最小值資訊,但是不知道是因為沒吃飯還是怎麼地,思維就此僵住了。

正確解法

遇到問題解決不了,感覺心裡很不爽,於是吃飯的時候又開始想怎麼充分理由棧的特性,有效的快取最小值資訊,以便min操作使用。

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

文字可能沒說清楚,上**,下面是php的實現,通過陣列來模擬堆疊。

<?php /**

* 使用乙個輔助棧,o(1)複雜度求出棧中的最小數

* @hack 類中通過陣列來模擬堆疊

* * @author laiwenhui

*/class strack

array_pop($this->_arrmin);

$this->_top--;

return array_pop($this->_arrdata);

} /**

* 入棧

* @param int $element

* @return bool

*/public function push($element)

//不為空,判斷入棧的值是否比最小棧棧頂小

$min = $this->程式設計客棧_arrmin[$this->_top];

//比較求出最小值

$currentmin = $element < $min ? $element : $min;

//當前棧中最小值入棧

array_push($this->_arrmin, $currentmin);

//資料入棧

array_push($this->_arrdata, $element);

$this->_top++;

return true;

} /**

* 求當前棧空間的最小值

www.cppcns.com * @return bool|int

*/public function min()

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解決的乙個棧的面試題

本文位址: /wangluo/php/110165.html

面試題 用兩個佇列實現乙個棧

在做這道題之前,我們首先要搞清楚佇列和棧的特點。佇列 先進先出,即插入資料在隊尾進行,刪除資料在隊頭進行 棧 後進先出,即插入與刪除資料均在棧頂進行。pop 如果我們要實現乙個棧,我們先進入的資料一定是先出去的,怎麼樣利用佇列實現這個特點呢?我們可以利用兩個佇列來進行資料順序的調整。當我們需要刪除資...

乙個面試題

題目是 假設乙個 搜尋引擎收錄了2 24首歌曲,並記錄了可收聽這些歌曲的2 30條url,但每首歌的url不超過2 10個。系統會定期檢查這些url,如果乙個url不可用則不出現在搜尋結果中。現在歌曲名和url分別通過整型的song id和url id唯一確定。對該系統有如下需求 1 通過song ...

乙個面試題

在不超過最右邊的數量的情況下任意組合,要求加起來不超過20280這個數字,但達成最接近的情況,現有一種方法為 1290 4 2990 5,差170,有沒有更接近20280的答案 資料如下 4900 13790 22990 5 意思是不能超過5次,但可以使用1次,2次,3次,4次,5次。2390 31...