摘要:棧和隊(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
摘要:堆棧算法引子棧是計(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] */ 引子 ????棧...
摘要:堆棧算法引子棧是計(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] */ 引子 ????棧...
摘要:本文力求簡(jiǎn)潔,只包含基礎(chǔ)的棧功能,不想將大片的代碼展示出來,讓讀者興趣索然,閱讀起來也十分費(fèi)力,如有需要可以自行添加相關(guān)功能比如包中的類包含的,等等函數(shù)能力有限,有誤之處還請(qǐng)不吝賜教定義內(nèi)部類用于存儲(chǔ)棧元素指向下一個(gè)棧元素的泛型元素方法方法 本文力求簡(jiǎn)潔,只包含基礎(chǔ)的棧功能,不想將大片的代碼展示出來,讓讀者興趣索然,閱讀起來也十分費(fèi)力,如有需要可以自行添加相關(guān)功能比如java.util...
摘要:于是翻出了機(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)與算...
摘要:首發(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)作。 如...
閱讀 3591·2021-11-24 10:19
閱讀 3730·2021-09-30 09:47
閱讀 1293·2019-08-30 15:56
閱讀 790·2019-08-29 15:11
閱讀 905·2019-08-29 13:43
閱讀 3570·2019-08-28 18:25
閱讀 2160·2019-08-26 13:27
閱讀 1439·2019-08-26 11:44