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