输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。

来源:互联网 发布:手机天猫 手机淘宝 编辑:程序博客网 时间:2024/05/01 04:28
package Test;public class Solution {public static void main(String[] args) {int pushA[]={1,2,3,4,5};int popA[]={4,3,5,1,2};System.out.println(IsPopOrder(pushA,popA));}/****************************************************************************** * 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。 *     假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列, *     但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) * 注意:数组的长度相同,数组中不会出现重复的数字,但是可能长度为1,并且入栈数组并不一定是1,2,3,4这样从小到大的序列 *        有可能是2,1,3,5,4之类的数字。 * 关键:记录出栈数组元素对应在入栈数组中索引顺序,入栈数组元素的索引代表着那个元素先入栈,入栈顺序会对出栈元素的顺序有限制 *    1.后面元素的索引大于前面的索引肯定成立 *    2.后面元素的索引等于(=)前面的索引-1肯定成立 *    3.后面元素的索引<前面的索引-1 会有不成立的可能 *   假如该元素的的索引为data[j],j表示出栈数组的下标,取max=max{data[0],data[1]...data[j-1]} * 则当第j个元素的索引==0到max-1中除去data[0],data[1]...data[j]的最大的一个元素时,该序列还是满足条件的,继续查找j++; * 否则return false; * @param pushA  入栈顺序数组 * @param popA   出栈顺序数组 * @return ******************************************************************************/public static boolean IsPopOrder(int [] pushA,int [] popA)     {if(pushA.length!=1){int data[]=new int[pushA.length];for(int i=0;i<pushA.length;i++){data[i]=findIndex(pushA,popA[i]);//以入栈顺序为基准,存储出栈元素对应的索引}int j=1;int max=-1;while(j<pushA.length-1){if(data[j]>data[j-1])//后面大于前面肯定成立{}else if(data[j]==data[j-1]-1){}else     //后面小于前面,则该元素必须为在0--max{data[0]...data[j-1]}中除去 data[0]--data[j-1],{for(int i=0;i<j;i++)//{max=Math.max(max,data[i]);//则该元素必须为在0--max{data[0]...data[j-1]}}for(int i=max-1;i>=0;i--){int count=0;for(int p=0;p<j;p++){if(i==data[p]){count++;}}if(count==0)//一旦都不相同,表明下一个位该是当前的i值了{if(data[j]==i)//说明位置j是成立的break;elsereturn false;}}}j++;}return true;}else{return pushA[0]==popA[0]?true:false;}    }   public static int findIndex(int[] pushA,int value)    {        int start=0;        int end=pushA.length-1;        int mid=0;        while(start<=end)            {            mid=(start+end)/2;            if(pushA[mid]>value)                end=mid-1;            else if(value>pushA[mid])                start=mid+1;            else                 return mid;        }        return -1;}}

阅读全文
0 0
原创粉丝点击