php实现栈的压入、弹出序列(**)(算法步骤)(画图)

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 }
原文地址:https://www.cnblogs.com/Renyi-Fan/p/9094777.html