您的位置:首页 > 理论基础 > 数据结构算法

PHP数据结构之六 PHP栈的应用举例【数制转换和括号匹配算法】

2016-08-08 15:50 627 查看
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>";

?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: