一看就懂 !java 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否是该栈的弹出顺序。

假设压入栈的所有数字均不相等,例如:序列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));
    
}

测试结果:

猜你喜欢

转载自www.cnblogs.com/zunzunzunshen/p/10325206.html
今日推荐