PHP数据结构之六 PHP栈的应用举例【数制转换和括号匹配算法】
PHP栈的应用举例【数制转换和括号匹配算法】
<?php /** *栈的应用举例 * *1.十进制整数转换为二、八、十六进制整数 *2.括号匹配问题 */ header("content-type:text/html;charset=gb2312"); //在PHP数据结构之五 栈的PHP的实现和栈的基本操作可以找到StackLinked类 include_once("./StackLinked.class.php"); /** *十进制整数转换为二、八、十六进制整数 * *@param int $input 待转换的十进制数 *@param int $output_scale 输出的进制 *@return array $array['before']输出的十进制整型数(整型) $array['after'] 转换后的整型数(整型) $array['stringclass'] 转换后的整型数的字符串表示(字符串型) */ function scaleconvert($input,$output_scale){ if(is_int($input)){ $a=$input; $scale=array(2,8,16); if(in_array($output_scale,$scale)){ $stack=new StackLinked(); while($a!=0){ $mod=$a % $output_scale; $stack->getPushStack($mod); $a=(int)($a-$mod)/$output_scale; } $elems=$stack->getAllPopStack(); $output=''; if($output_scale == 16){ $output.='0x'; }elseif($output_scale == 8){ $output.='0'; } foreach($elems as $value){ if($output_scale == 16){ switch($value){ case 10: $value='A'; break; case 11: $value='B'; break; case 12: $value='C'; break; case 13: $value='D'; break; case 14: $value='E'; break; case 15: $value='F'; break; } } $output.=$value; } //因为输出语句会自动将整型的数转换为10进制输出, //也即如果转换后的结果为0xff,直接将0xff输出会得到255,所以返回一数组 return array('before'=>$input,'after'=>intval($output,$output_scale),'stringclass'=>$output); }else{ return 0; } }else{ return 0; } } /** *实现括号匹配算法 * *@param string $str *@return mixed 匹配成功返回一个数组,否则返回false */ function bracketmatch($str){ $substr=''; $brackets=array(); $stack=new StackLinked(); $strlen=strlen($str); $leftb="("; $rightb=")"; for($i=0;$i<$strlen;$i++){ $cu=$str[$i]; if(ord($cu)>127){ $cu=substr($str,$i,2); $i++; } if($cu == $leftb){ if(strlen($substr)>0){ $e=array('v'=>$substr,'d'=>'L'); $stack->getPushStack($e); } $stack->getPushStack($cu); $substr=''; } if($cu == $rightb){ if(strlen($substr)>0){ $e=array('v'=>$substr,'d'=>'R'); $stack->getPushStack($e); $substr=''; } $bl='('; $tag=true; $remain=$stack->getCountForElem('('); $e1=''; while($tag && !$stack->getIsEmpty()){ $stack->getPopStack($e1); if($e1 == $leftb){ $bl.=')'; $brackets[$remain][]=$bl; $tag=false; }else{ if($e1['d'] == 'L'){ $bl='('.$e1['v'].substr($bl,1); }else{ $bl.=$e1['v']; } } } } if($cu !='(' && $cu != ')'){ $substr.=$cu; } } if($stack->getCountForElem('(') == 0){ $stack->getAllPopStack(); return $brackets; }else{ return false; } } $num=255; $output_scale=16; $renum=scaleconvert($num,$output_scale); echo "10进制数{$renum['before']}转换为{$output_scale}进制为:".$renum['stringclass']; echo "<br /><pre>"; var_dump(bracketmatch("(sfsf((徐典阳(喹)sfsdf)(sfsf)sdfsa(啦啦))啦嘌呆在abc)")); echo "</pre>"; ?>