假设压入栈的所有数字均不相等,例如:序列1,2,3,4,5是某栈的压栈序列,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,
但4,3,5,1,2就不是该压栈序列的弹出序列。
解题思路:
我们先来模拟按照序列1,2,3,4,5的顺序压栈,如何得到弹出序列4,5,3,2,1。
1.压入1
2.压入2
3.压入3
4.压入4
5.弹出栈顶元素4,弹出序列为4
6.压入5
7.弹出栈顶元素5,得到弹出序列4,5
8.弹出栈内剩余元素,得到弹出序列4,5,3,2,1
根据上面的模拟情况,我们找到了思路,我们可以按照压栈序列的顺序压栈,每压入一个元素后,就与弹出序列没有比较过的第一个元素进行比较,当栈顶元素与弹出序列的第一个元素相等时,弹出这个元素,下一次比较用弹出序列的第二个元素。如果不相等,继续按照压栈序列压栈。如果压栈完成但是还没有比完所有的弹出序列中的元素,则不再压栈,直接将栈顶元素与弹出序列中的元素进行比较。如果弹出序列中的元素全部比完,则此序列是该栈的弹出序列。
实现代码:
import java.util.Stack; public class Test { public static boolean isPopOrder(int[] pPush,int[] pPop){ if(pPush==null||pPop==null) {//压栈序列和弹出序列皆为空,则返回false return false; } Stack<Integer> stack=new Stack<>(); int i=0; int j=0; while(j<pPush.length) { if(pPop.length>pPush.length) { return false; } if(i<pPush.length) { stack.push(pPush[i]);//依次压入压栈序列中的元素 i++; } if(stack.peek()==pPop[j]) {//栈顶元素与弹出序列中的元素进行比较 stack.pop();//如果相等则弹出 j++; } if(j==pPop.length) {//如果弹出序列中的元素全部比完,则该序列为弹出序列 return true; } if(i==pPush.length&&stack.peek()!=pPop[j]) {//如果压栈序列已经全部压入栈中,但栈顶元素与弹出序列中的元素不相同 //该序列不是弹出序列 return false; } } return false; }
测试代码:
public static void main(String args[]) { int[] arr={6,1,2,3,4,5}; int[] brr= {4,5,3,2,1}; int[] crr= {1,2,3,4,5}; int[] drr= {5,4,1,2,3}; System.out.println( isPopOrder(arr,brr)); System.out.println( isPopOrder(arr,crr)); System.out.println( isPopOrder(arr,drr)); }
测试结果: