PHP 棧的實(shí)現(xiàn)與應(yīng)用

下面我們將探討棧在 PHP 中的實(shí)現(xiàn)與應(yīng)用.

理解棧

棧是線性數(shù)據(jù)結(jié)構(gòu),遵循著后進(jìn)先出的原則.這意味著棧只有一個端口可以提供添加和移除元素.棧的插入操作叫做進(jìn)棧,刪除操作叫做出棧.

  • 入棧
  • 出棧
  • 彈出頂端元素
  • 是否為空
    下面用 PHP 用不同的方法來實(shí)現(xiàn)棧.首先先用 PHP 內(nèi)建數(shù)組函數(shù),然后用其他數(shù)據(jù)結(jié)構(gòu)例如鏈表

使用 PHP 數(shù)組實(shí)現(xiàn)棧

interface IStack {
    public function push(string $item); 

    public function pop(); 

    public function top(); 

    public function isEmpty();
}
class Stack implements IStack
{

    private $limit;
    private $stack;

    public function __construct(int $limit = 20)
    {
        $this->limit = $limit;
        $this->stack = [];
    }

    public function pop(): string
    {
        if ($this->isEmpty()) {
            throw new UnderflowException('Stack is empty');
        } else {
            return array_pop($this->stack);
        }
    }

    public function push(string $newItem)
    {
        if (count($this->stack) < $this->limit) {
            array_push($this->stack, $newItem);
        } else {
            throw new OverflowException('Stack is full');
        }
    }

    public function top(): string
    {
        return end($this->stack);
    }

    public function isEmpty(): bool
    {
        return empty($this->stack);
    }
}

使用鏈表實(shí)現(xiàn)棧

use LinkedList;

class BookList implements Stack
{

    private $stack;

    public function __construct()
    {
        $this->stack = new LinkedList();
    }

    public function pop(): string
    {

        if ($this->isEmpty()) {
            throw new UnderflowException('Stack is empty');
        } else {
            $lastItem = $this->top();
            $this->stack->deleteLast();
            return $lastItem;
        }
    }

    public function push(string $newItem)
    {

        $this->stack->insert($newItem);
    }

    public function top(): string
    {
        return $this->stack->getNthNode($this->stack->getSize())->data;
    }

    public function isEmpty(): bool
    {
        return $this->stack->getSize() == 0;
    }
}

使用 SplStack 類 實(shí)現(xiàn)棧

如果我們不想自己實(shí)現(xiàn)棧,可以使用已經(jīng)存在 SPL 來實(shí)現(xiàn).SplStack通過 SplDoublyLinkedList 來實(shí)現(xiàn).

$books = new SplStack(); 
$books->push("Introduction to PHP7"); 
$books->push("Mastering JavaScript"); 
$books->push("MySQL Workbench tutorial"); 
echo $books->pop() . "\n"; 
echo $books->top() . "\n";”

棧的使用

棧在實(shí)際應(yīng)用的開發(fā)中有很多使用,如:瀏覽器歷時等.下面看一下實(shí)際的問題

括號嵌套匹配

當(dāng)我們在解決數(shù)學(xué)計算表達(dá)式的問題,首先應(yīng)該考慮括號的正確嵌套.如:

8*(9-2) + {(4*5) / (2*2)}
5*8*9 / (3*2))
[{(2*7) + (15-3)]

上面的表達(dá)式只有一個是正確的,為了檢測是正確,我們可以使用棧來實(shí)現(xiàn).下面是實(shí)現(xiàn)的算法:

function expressionChecker(string $expression): bool
{
    $valid = TRUE;
    $stack = new SplStack();

    for ($i = 0; $i < strlen($expression); $i++) {
        $char = substr($expression, $i, 1);

        switch ($char) {
            case '(':
            case '{':
            case '[':
                $stack->push($char);
                break;

            case ')':
            case '}':
            case ']':
                if ($stack->isEmpty()) {
                    $valid = FALSE;
                } else {
                    $last = $stack->pop();
                    if (($char == ")" && $last != "(")
                        || ($char == "}" && $last != "{")
                        || ($char == "]" && $last != "[")
                    ) {

                        $valid = FALSE;
                    }
                }
                break;
        }

        if (!$valid)
            break;
    }

    if (!$stack->isEmpty()) {
        $valid = FALSE;
    }

    return $valid;
}

$expressions = []; 
$expressions[] = "8 * (9 -2) + { (4 * 5) / ( 2 * 2) }"; 
$expressions[] = "5 * 8 * 9 / ( 3 * 2 ) )"; 
$expressions[] = "[{ (2 * 7) + ( 15 - 3) ]"; 

foreach ($expressions as $expression) { 
    $valid = expressionChecker($expression); 

    if ($valid) { 
        echo "Expression is valid \n"; 
        echo "<br>";
    } else { 
        echo "Expression is not valid \n"; 
        echo "<br>";
    } 
}

返回

Expression is valid 
Expression is not valid 
Expression is not valid 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末镣煮,一起剝皮案震驚了整個濱河市昔馋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌揭蜒,老刑警劉巖淘衙,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件传藏,死亡現(xiàn)場離奇詭異,居然都是意外死亡彤守,警方通過查閱死者的電腦和手機(jī)毯侦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來具垫,“玉大人侈离,你說我怎么就攤上這事◇莶希” “怎么了卦碾?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵铺坞,是天一觀的道長。 經(jīng)常有香客問我洲胖,道長济榨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上晕拆,老公的妹妹穿的比我還像新娘。我一直安慰自己橘忱,他們只是感情好赴魁,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布卸奉。 她就那樣靜靜地躺著,像睡著了一般颖御。 火紅的嫁衣襯著肌膚如雪榄棵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天潘拱,我揣著相機(jī)與錄音疹鳄,去河邊找鬼。 笑死芦岂,一個胖子當(dāng)著我的面吹牛瘪弓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播禽最,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼腺怯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了川无?” 一聲冷哼從身側(cè)響起呛占,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎懦趋,沒想到半個月后晾虑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仅叫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年帜篇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诫咱。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡笙隙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出遂跟,到底是詐尸還是另有隱情逃沿,我是刑警寧澤婴渡,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站凯亮,受9級特大地震影響边臼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜假消,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一柠并、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧富拗,春花似錦臼予、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至创千,卻和暖如春缰雇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背追驴。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工械哟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人殿雪。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓暇咆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親丙曙。 傳聞我的和親對象是個殘疾皇子爸业,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,846評論 25 707
  • Welcome 目前網(wǎng)絡(luò)上充斥著大量的陳舊信息,讓PHP新手誤入歧途河泳,傳播著錯誤的實(shí)踐和糟糕的代碼沃呢,這必須得到糾正...
    layjoy閱讀 21,666評論 7 118
  • “下學(xué)期薄霜,我準(zhǔn)備將雷奧轉(zhuǎn)到熱風(fēng)外語幼兒園,”愛弗莉說纸兔。 米藍(lán)一愣惰瓜,看向梅根,發(fā)現(xiàn)對方也正一頭霧水地看著自己汉矿。她再看...
    那漾安逸閱讀 347評論 0 0
  • 終于還是克制住了在兩天前加入刷屏大軍的沖動崎坊,最重要的話當(dāng)然要留在生日這天送給你咯:兩年前開始,12月25號洲拇,在我腦...
    ChungHsun閱讀 290評論 0 0
  • “我在外面奈揍,喝了很多酒曲尸。” 多年前男翰,記不起是七另患、八年前還是八、九年前蛾绎,我收到莉莉發(fā)來的信息...
    Philaielouros閱讀 361評論 0 1