基于PHP实际数据结构的栈和队列在实际PHP数据结构基础上,栈和队列与前面提到的双链表一样,都是线性结构。栈有什么特点栈遵循后进先出(LIFO)的原则。这意味着堆栈只有一个用于压入和弹出元素的出口。我们在进行push或者pop操作的时候,一定要注意栈是满的还是空的。常用操作还是不多废话,直接看我们对栈的常用操作。pushpoptopisEmpty...PHP实现首先我们定义一个StackInterface。接口StackInterface{publicfunctionpush(string$item);公共函数弹出();公共功能顶部();publicfunctionisEmpty();}来看看基于数组的栈实例classArrStackimplementsStackInterface{private$stack;私人$限额;公共函数__construct(int$limit=20){$this->limit=$limit;$this->堆栈=[];}公共函数__get($val){返回$this->$val;}publicfunctionpush(string$data=null){if(count($this->stack)<$this->limit){array_push($this->stack,$data);}else{thrownew\OverflowException('堆栈溢出');}}publicfunctionpop(){if($this->isEmpty()){thrownew\UnderflowException('stackisempty');}else{returnarray_pop($this->stack);}}publicfunctionisEmpty(){returnempty($this->stack);}公开c函数top(){返回结束($this->stack);}得益于PHP强大的数组结构,我们可以轻松编写出栈的基本操作方法。果然,世界上最好的语言名副其实。那么有同学说,你说栈和前面的链表都是线性结构,那直接用链表实现栈可以吗?这个问题很尖锐,答案是肯定的。机智的同学可能已经猜到了。之前定义了一个stack接口,stack的实现肯定不止上面一个。下面看一下基于链表的实现。类LinkedListStack实现StackInterface{private$stack;私人$限额;公共函数__construct(int$limit){$this->limit=$limit;$this->stack=newLinkedList();}publicfunctiontop(){return$this->stack->getNthNode($this->stack->getSize()-1)->data;}publicfunctionisEmpty(){return$this->stack->getSize()===0;}publicfunctionpop(){if($this->isEmpty()){thrownew\UnderflowException('stackisempty');}else{$lastItem=$this->top();$this->stack->deleteLast();返回$lastItem;}}publicfunctionpush(string$item){if($this->stack->getSize()<$this->limit){$this->stack->insert($item);}else{thrownew\OverflowException('堆栈溢出');}}里面触及了之前的链接显示,没了了解详情的同学可以去这里看看。又有同学问了,栈有什么用?这个问题很好,我们来看一个需求。请实现一个数学表达式检查类,输入以下表达式,预期结果为真。“8*(9-2)+{(4*5)/(2*2)}是错误的。“5*8*9/(3*2))”也是错误的。”[{(2*7)+(15-3)]》自己想一想,再往下看去体会。classExpressionChecker{//$expressions[]="8*(9-2)+{(4*5)/(2*2)}";//$expressions[]="5*8*9/(3*2))";//$表达式[]="[{(2*7)+(15-3)]";publicfunctioncheck(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())返回false;$last=$stack->pop();如果($item=='{'&&$last!='}'||$item=='('&&$last!=')'||$item=='['&&$last!=']')返回假;休息;}}if($stack->isEmpty()){返回真;}返回假;}}专题系列PHP基础数据结构专题系列目录地址:https://github.com/...主要用PHP语法总结基本的数据结构和算法,以及我们日常PHP中容易忽略的基础知识开发,以及现代PHP开发规范、部署和优化的一些实用建议,以及对Javascript语言特性的深入研究。
