栈的压入、弹出序列(Java)

问题:

压栈 与 入栈 顺序 是否一致 

思路:

     * 解决这个问题很直观的想法就是建立一个辅助栈,把输入的第一个序列中的数字依次压入该辅助栈,并按照第二个序列的顺序依次从该栈中弹出数字。
     * 
     * 判断一个序列是不是栈的弹出序列的规律:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出。
     * 如果下一个弹出的数字不在栈顶,我们把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶为止。
     * 如果所有的数字都压入栈了仍然没有找到下一个弹出的数字,那么该序列不可能是一个弹出序列。

代码:

package com.my.test.datastructure.stack;

import java.util.Stack;

/**
 * 压栈 与 入栈 顺序 是否一致 
 */
public class RightOrder
{

    /**
     * 解决这个问题很直观的想法就是建立一个辅助栈,把输入的第一个序列中的数字依次压入该辅助栈,并按照第二个序列的顺序依次从该栈中弹出数字。
     * 
     * 判断一个序列是不是栈的弹出序列的规律:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出。
     * 如果下一个弹出的数字不在栈顶,我们把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶为止。
     * 如果所有的数字都压入栈了仍然没有找到下一个弹出的数字,那么该序列不可能是一个弹出序列。
     */
    public static boolean isRightOrder(int[] inOrder, int[] outOrder) {
        
        // 校验
        if (inOrder == null || outOrder == null) {
            throw new RuntimeException("Invalid param");
        }
        
        int len1 = inOrder.length;
        int len2 = outOrder.length;
        if (len1 != len2) {
            return false;
        }
        
        // 利用辅助栈处理
        Stack<Integer> stack = new Stack<>();
        
        // 入栈序列索引
        int pushInx = 0;
        
        for (int i = 0; i < len2; i++) {
            int curEle = outOrder[i];
            
            // 如果当前元素不是要弹出的元素 则数据入栈
            while (pushInx < len1 && (stack.empty() || stack.peek() != curEle)) {
                stack.push(inOrder[pushInx]);
                pushInx++;
            }
            
            // 弹出当前元素
            if (stack.peek() == curEle) {
                stack.pop();
            } else {
                return false;
            }
        }
        
        return true;
    }
    
    public static void main(String[] args)
    {
        int[] push = {1, 2, 3, 4, 5};
        int[] pop1 = {4, 5, 3, 2, 1};
        int[] pop2 = {3, 5, 4, 2, 1};
        int[] pop3 = {4, 3, 5, 1, 2};
        int[] pop4 = {3, 5, 4, 1, 2};

        System.out.println("true: " + isRightOrder(push, pop1));
        System.out.println("true: " + isRightOrder(push, pop2));
        System.out.println("false: " + isRightOrder(push, pop3));
        System.out.println("false: " + isRightOrder(push, pop4));
    }

}

参考:

栈的压入、弹出序列:https://blog.csdn.net/derrantcm/article/details/46691083

猜你喜欢

转载自blog.csdn.net/zangdaiyang1991/article/details/88635917