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>";
?>
<?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>";
?>
相关文章推荐
- 数据结构(8)--栈的应用之行编辑程序、括号匹配检验、数制转换、hanio塔问题
- imooc数据结构探险-栈篇 栈应用括号匹配二 由群友启发改良james_yuan老师算法
- 堆栈数据结构应用之括号匹配检查(算法3.2.2)
- 3.2栈的应用举例----数制转换、括号匹配及行编辑
- 数据结构 P49 栈的应用举例-括号匹配的检验
- 栈的简单应用(数制转换、括号匹配检验、行编辑、迷宫求解)
- 数据结构应用-----------括号匹配的检验
- Java堆栈的应用1----------堆栈的自定义实现以及括号匹配算法的Java实现
- 数据结构笔记之——括号匹配(栈的应用之一)(SDOJ 2134)
- 数据结构-栈的应用-算术表达式小括号匹配
- 数据结构的应用——使用栈实现字符串括号匹配检查
- 数据结构 栈应用(括号匹配检测)
- 【学习点滴-数据结构-栈&队列】 栈的应用之二:括号匹配的检测
- 数据冒险之栈应用(数制转换、括号匹配)
- 基于PHP实现栈数据结构和括号匹配算法示例
- 【数据结构和算法】栈的java实现和栈的应用举例
- 重温数据结构-栈的应用:进制转换,括号匹配检测,行编辑,迷宫求解,求表达式的值
- 数据结构 栈的应用 括号匹配
- 栈的应用举例——括号匹配的检验
- 栈的应用1:数制转换、括号匹配检验和行编辑程序