当前位置: 首页 > 后端技术 > PHP

数据结构-PHP实现'栈'结构匹配花括号有效性

时间:2023-03-29 23:29:10 PHP

这篇文章就是展示如何使用栈(Stack)数据结构来匹配花括号的有效性。首先提出问题,这里直接贴出问题如下:给定一个只包含'(',')','{','}','[',']'字符串的数据结构,对判断字符串是否有效。----------------------------------------------示例1:输入:"()"输出:true示例2:输入:"()[]{}"输出:true示例3:输入:"(]"输出:false示例4:输入:"([)]"Output:false示例5:Input:"{[]}"Output:true1.output_match_bracket.php这是一个显示文件,调用并打印出结果:isValid($str));//输出真$str="[()[{[]}]{}]({([]([()][}]))})";var_dump($matchBracket->isValid($str));//outputfalse2.MatchBracket类该类主要作用是接收需要匹配的字符串,然后调用入栈出栈逻辑,通过花括号的巧妙偏移判断花括号是否闭合:isEmpty()&&$str[$i]=="]"&&$stackStruct->peek()!="["){returnfalse;}elseif(!$stackStruct->isEmpty()&&$str[$i]==")"&&$stackStruct->peek()!="("){returnfalse;}elseif(!$stackStruct->isEmpty()&&$str[$i]=="}"&&$stackStruct->peek()!="{"){返回false;}elseif(!$stackStruct->isEmpty()&&$str[$i]=="]"&&$stackStruct->peek()=="["){$stackStruct->pop();//弹出偏移}elseif(!$stackStruct->isEmpty()&&$str[$i]==")"&&$stackStruct->peek()=="("){$stackStruct->pop();//弹出偏移}elseif(!$stackStruct->isEmpty()&&$str[$i]=="}"&&$stackStruct->peek()=="{"){$stackStruct->pop();//弹出偏移量}else{$stackStruct->push($str[$i]);}}//如"$str=[({",如果最后一个栈不为空,说明括号没有闭合if(!$stackStruct->isEmpty()){返回假硒;}返回真;}}3.StackStruct栈类这里是一个栈类,它继承了array类的方法,实现了压入(push)和出栈(pop),查看栈顶(peek):array=newArrayStruct($capacity);}/***获取堆栈大小*@returnint*/publicfunctiongetSize():int{return$this->array->getSize();}/***判断栈是否为空*@returnbool*/publicfunctionisEmpty():bool{return$this->array->isEmpty();}/***元素被压入栈中*/publicfunctionpush($e):void{$this->array->addLast($e);}/***出栈*@returnmixed*/publicfunctionpop(){return$this->array->removeLast();}/***查看栈顶元素*@returnmixed*/publicfunctionpeek(){return$this->array->getLast();}/***将堆栈数组转换为字符串*@returnstring*/publicfunctiontoString():string{返回$this->array->toString();}}4.interfaceStack这里是stack类的一个实现接口,定义了一些函数,使得StackStrcut继承后,必须重构capacity=$capacity;}/***获取数组元素个数*@returnint*/publicfunctiongetSize():int{return$this->size;}/***获取数组的容量*@returnint*/publicfunctiongetCapacity():int{返回$this->capacity;}/***判断数组是否为空*@returnbool*/publicfunctionisEmpty():bool{return$this->size==0;}/***向数组的指定位置插入一个元素*@paramint$index*@param$e*@throwsException*/publicfunctionadd(int$index,$e):void{if($this->size==$this->capacity){$this->resize(2);//扩大到原来大小的2倍}if($index<0||$index>$this->size){echo"添加的位置超出了数组的大小";出口;}//为了便于理解,[1,2,4,5,6],假设$index=3;$e=100,在插入[1,2,4,100,5,6]之后for($i=$this->size;$i>=$index;$i--){$this->data[$i]=$this->data[$i-1];}$this->data[$index]=$e;$这个->尺寸++;}/***添加一个元素到数组的末尾*@param$e*@throwsException*/publicfunctionaddLast($e):void{$this->add($this->size,$e);}/***在数组的开头插入一个元素*@param$e*@throwsException*/publicfunctionaddFirst($e):void{$this->add(0,$e);}/***获取索引位置数组元素*@paramint$index*@returnmixed*/publicfunctionget(int$index){if($index<0||$index>$this->size){echo"索引值超出元素的位置范围,";出口;}返回$this->data[$index];}/***获取数组结束元素*@returnmixed*/publicfunctiongetLast(){return$this->get($this->size-1);}/***判断数组中是否有元素*@param$e*@returnbool*/publicfunctioncontains($e):bool{for($i=1;$i<$this->size;$i++){if($this->data[$i]==$e){返回真;}}返回假;}/***检查数组中某个元素的位置索引值,如果不存在则返回-1*@param$e*@returnint*/publicfunctionfind($e):int{for($i=0;$i<$this->size;$i++){if($this->data[$i]==$e){返回$i;}}返回-1;}/***删除数组中指定位置的元素,返回删除元素的值*@param$index*@returnmixed*/publicfunctionremove($index){if($index<0||$index>$this->size){echo"索引值超出元素的位置范围,";出口;$e=$this->data[$index];对于($i=$index;$i<$this->size-1;$i++){$this->data[$i]=$this->data[$i+1];}$this->size--;$this->数据[$this->size]=null;//游荡的物体!=memory/**如果当前数组大小小于一半容量,重新分配一半数组空间**/if($this->size<=$this->capacity/4&&$this->容量%2==0){$this->resize(0.5);}返回$e;}/***删除数组的第一个元素,并返回删除元素的值*/publicfunctionremoveFirst(){return$this->remove(0);}/***删除数组的第一个元素,并返回删除元素的值*/publicfunctionremoveLast(){return$this->remove($this->size-1);}/***删除数组中的特定元素*@param$e*/publicfunctionremoveElement($e){for($i=0;$i<$this->size;$i++){if($this->data[$i]==$e){$this->remove($i);$this->removeElement($e);休息;}}}/***数组扩容,对于其他语言,比如JAVA,需要重新开空间*@param$factor*/protectedfunctionresize($factor){$this->capacity=$factor*$这个->能力;}/***将数组转换为字符串*@returnstring*/publicfunctiontoString():string{$str="[";对于($i=0;$i<$this->size;$i++){$value_str=is_numeric($this->data[$i])?$this->数据[$i]:"'{$this->data[$i]}'";$str.=$i.“=>”。$value_str。",";}$str=trim($str,",");$海峡.=“]”;返回$str;}}Tips:如果对栈不熟悉,可以参考之前的文章数据结构——PHP通过Array类对象实现“栈”和数据结构——PHP实现Array代码仓库:https://gitee.com/love-for-po...扫描二维码关注爱银世贤