成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

實(shí)戰(zhàn)PHP數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)之棧

banana_pi / 2700人閱讀

摘要:棧和隊(duì)列棧和隊(duì)列和之前講到的實(shí)戰(zhàn)數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)之雙鏈表一樣都是線性結(jié)構(gòu)。來看基于數(shù)組的棧實(shí)現(xiàn)得益于強(qiáng)大的結(jié)構(gòu),我們輕而易舉的寫出來了棧的基本操作方法。專題系列基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)專題系列目錄地址主要使用語(yǔ)法總結(jié)基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)和算法。

棧和隊(duì)列

棧和隊(duì)列和之前講到的實(shí)戰(zhàn)PHP數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)之雙鏈表 一樣都是線性結(jié)構(gòu)。

棧有什么特點(diǎn)

棧遵循后進(jìn)先出的原則(LIFO)。這意味著棧只有一個(gè)出口用來壓入元素和彈出元素,當(dāng)我們執(zhí)行壓入或者彈出操作的時(shí)候要注意棧是否已滿或者棧是否是空的。

常見操作

還是廢話不多說,直接來看我們對(duì)棧執(zhí)行的常用操作。

push

pop

top

isEmpty

...

PHP實(shí)現(xiàn)

首先我們定義一個(gè)StackInterface。

interface StackInterface
{
    public function push(string $item);
    public function pop();
    public function top();
    public function isEmpty();
}

來看基于數(shù)組的棧實(shí)現(xiàn)

class ArrStack implements StackInterface
{
    private $stack;
    private $limit;

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

    public function __get($val)
    {
        return $this->$val;
    }

    public function push(string $data = null)
    {
        if (count($this->stack) < $this->limit) {
            array_push($this->stack, $data);
        } else {
            throw new OverflowException("stack is overflow");
        }
    }

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

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

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

得益于PHP強(qiáng)大的array結(jié)構(gòu),我們輕而易舉的寫出來了棧的基本操作方法。果然世界上最好的語(yǔ)言名不虛傳。

那有同學(xué)說了,你說棧和之前的鏈表都是線性結(jié)構(gòu),那可不可以直接使用鏈表實(shí)現(xiàn)棧呢?這個(gè)問題非常犀利啊,答案是可以的。

可能機(jī)智的同學(xué)已經(jīng)猜到了,我之前已經(jīng)定義了一個(gè)棧接口,那棧的實(shí)現(xiàn)肯定不止只有上面一種哈。來看基于鏈表的實(shí)現(xiàn)。

class LinkedListStack implements StackInterface
{
    private $stack;
    private $limit;

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

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

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

    public function pop()
    {
        if ($this->isEmpty()) {
            throw new UnderflowException("stack is empty");
        } else {
            $lastItem = $this->top();
            $this->stack->deleteLast();

            return $lastItem;
        }
    }

    public function push(string $item)
    {
        if ($this->stack->getSize() < $this->limit) {
            $this->stack->insert($item);
        } else {
            throw new OverflowException("stack is overflow");
        }
    }

里面涉及到了之前的鏈表實(shí)現(xiàn),不了解細(xì)節(jié)的同學(xué)可以去這里看看。有同學(xué)又問,那棧到底有什么用處?這個(gè)問題非常好,來看一個(gè)需求。

請(qǐng)實(shí)現(xiàn)一個(gè)數(shù)學(xué)表達(dá)式檢查類,輸入一個(gè)下面表達(dá)式,預(yù)期結(jié)果為true。

"8 * (9 -2) + { (4 * 5) / ( 2 * 2) }

下面的為false。

"5 * 8 * 9 / ( 3 * 2 ) )"

下面的也為false。

"[{ (2 * 7) + ( 15 - 3) ]"

自己想一下,再往下看實(shí)現(xiàn)。

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

    public function check(string $expression): bool
    {
        $stack = new SplStack();

        foreach (str_split($expression) as $item) {
            switch ($item) {
                case "{":
                case "[":
                case "(":
                    $stack->push($item);
                    break;

                case "}":
                case "]":
                case ")":
                    if ($stack->isEmpty()) return false;

                    $last = $stack->pop();

                    if (
                        $item == "{" && $last != "}" ||
                        $item == "(" && $last != ")" ||
                        $item == "[" && $last != "]"
                    )
                        return false;

                    break;
            }
        }

        if ($stack->isEmpty()) {
            return true;
        }

        return false;
    }
}
專題系列

PHP基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)專題系列目錄地址:https://github.com/... 主要使用PHP語(yǔ)法總結(jié)基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)和算法。還有我們?nèi)粘HP開發(fā)中容易忽略的基礎(chǔ)知識(shí)和現(xiàn)代PHP開發(fā)中關(guān)于規(guī)范、部署、優(yōu)化的一些實(shí)戰(zhàn)性建議,同時(shí)還有對(duì)Javascript語(yǔ)言特點(diǎn)的深入研究。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28838.html

相關(guān)文章

  • 利用PHP實(shí)現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)之棧(小白系列文章四)

    摘要:堆棧算法引子棧是計(jì)算機(jī)術(shù)語(yǔ)中比較重要的概念,實(shí)質(zhì)上棧就是一段內(nèi)存區(qū)域,但是棧滿足一定的特性,那就是只有一個(gè)口,具有先入后出的特性,這種特性在計(jì)算機(jī)中有很廣泛的運(yùn)用。 /** * PHP堆棧算法 * Created on 2017-4-27 * Author entner * Email [email protected] */ 引子 ????棧...

    array_huang 評(píng)論0 收藏0
  • 利用PHP實(shí)現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)之棧(小白系列文章四)

    摘要:堆棧算法引子棧是計(jì)算機(jī)術(shù)語(yǔ)中比較重要的概念,實(shí)質(zhì)上棧就是一段內(nèi)存區(qū)域,但是棧滿足一定的特性,那就是只有一個(gè)口,具有先入后出的特性,這種特性在計(jì)算機(jī)中有很廣泛的運(yùn)用。 /** * PHP堆棧算法 * Created on 2017-4-27 * Author entner * Email [email protected] */ 引子 ????棧...

    yankeys 評(píng)論0 收藏0
  • 數(shù)據(jù)結(jié)構(gòu)之棧(java版)

    摘要:本文力求簡(jiǎn)潔,只包含基礎(chǔ)的棧功能,不想將大片的代碼展示出來,讓讀者興趣索然,閱讀起來也十分費(fèi)力,如有需要可以自行添加相關(guān)功能比如包中的類包含的,等等函數(shù)能力有限,有誤之處還請(qǐng)不吝賜教定義內(nèi)部類用于存儲(chǔ)棧元素指向下一個(gè)棧元素的泛型元素方法方法 本文力求簡(jiǎn)潔,只包含基礎(chǔ)的棧功能,不想將大片的代碼展示出來,讓讀者興趣索然,閱讀起來也十分費(fèi)力,如有需要可以自行添加相關(guān)功能比如java.util...

    hizengzeng 評(píng)論0 收藏0
  • 學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之棧與隊(duì)列

    摘要:于是翻出了機(jī)房里的這本學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法開始學(xué)習(xí)程序員的基礎(chǔ)知識(shí)。這本書用了我最熟悉的來實(shí)現(xiàn)各種數(shù)據(jù)結(jié)構(gòu)和算法,而且書很薄,可以說是一本不錯(cuò)的入門教程。隊(duì)列在頭部刪除元素,尾部添加元素。 本系列所有文章:第一篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之棧與隊(duì)列第二篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之鏈表第三篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之集合第四篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之字典和散列表第五篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算...

    pingan8787 評(píng)論0 收藏0
  • Python - 收藏集 - 掘金

    摘要:首發(fā)于我的博客線程池進(jìn)程池網(wǎng)絡(luò)編程之同步異步阻塞非阻塞后端掘金本文為作者原創(chuàng),轉(zhuǎn)載請(qǐng)先與作者聯(lián)系。在了解的數(shù)據(jù)結(jié)構(gòu)時(shí),容器可迭代對(duì)象迭代器使用進(jìn)行并發(fā)編程篇二掘金我們今天繼續(xù)深入學(xué)習(xí)。 Python 算法實(shí)戰(zhàn)系列之棧 - 后端 - 掘金原文出處: 安生??? 棧(stack)又稱之為堆棧是一個(gè)特殊的有序表,其插入和刪除操作都在棧頂進(jìn)行操作,并且按照先進(jìn)后出,后進(jìn)先出的規(guī)則進(jìn)行運(yùn)作。 如...

    546669204 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<