php实现栈的压入、弹出序列(**)(算法步骤)(画图)
一、总结
1、算法步骤:一定要把算法步骤写下来,要不然太浪费时间了,尤其是思维不清晰的时候,尤其是题目有难度的时候,不然的话也非常容易出现低级错误
2、画图,把算法步骤画出来
二、php实现栈的压入、弹出序列
题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
三、代码
代码一:(php没过)
1 <?php 2 //一定要把算法步骤写下来,要不然太浪费时间了,尤其是思维不清晰的时候 3 //画图,把算法步骤画出来 4 function IsPopOrder($pushV, $popV) 5 { 6 //当栈顶的元素小于出栈序列的头,就不停的入栈,直到没有数可以入 7 //当栈顶的元素等于出栈队列的头,栈顶元素出栈,出栈队列后移,一直循环,如果出栈队列为空,则成功 8 //当栈顶的元素大于出栈队列的头,return false 9 $len=count($pushV); 10 $i=0; 11 $j=0; 12 $stk=array(); 13 while($j<$len){ 14 if(empty($stk)&&$i<$len) array_push($stk,$pushV[$i++]); 15 while(($top=array_pop($stk))<$popV[$j]&&$i<$len){array_push($stk,$top); array_push($stk,$pushV[$i++]);} 16 while(array_pop($stk)==$popV[$j]&&$j<$len) {$j++; if($j>=$len) return true;} 17 if(array_pop($stk)>$popV[$j]) return false; 18 } 19 return true; 20 21 }
代码二:php没过
1 <?php 2 //分类 3 function IsPopOrder($pushV, $popV) 4 { 5 $stk=array(); 6 $ru=0; 7 $chu=0; 8 $i_stk=0; 9 $len=count($pushV); 10 while($chu<$len){ 11 if(empty($stk)&&$ru<$len) {$stk[]=$pushV[$ru++]; $i_stk++;} 12 $top=$stk[$i_stk-1]; 13 //当栈顶元素小于出队序列元素时 14 if($top<$popV[$chu]){ 15 $stk[]=$pushV[$ru++]; $i_stk++; 16 } 17 //等于 18 if($top<$popV[$chu]){ 19 array_pop($stk); $i_stk--; $chu++; 20 } 21 22 //大于 23 if($top>$popV[$chu]){ 24 return false; 25 } 26 } 27 return true; 28 //如果入栈序列为空并且出栈队列为空,return true 29 // 30 31 }