考察点
辅助栈
知识点
题目
分析
这道题目要求输入俩个序列,第一个序列表示栈的压入顺序,要求判断第二个序列是否是该栈的弹出顺序。遇到这类题目思维一定要往辅助栈上靠,因为关于栈的考点其实就是这个。这种题目的解题思路就是归纳,通过举例寻找数字之间的规律。可以思考一下什么情况下能说明不是呢?当我们拿第二个序列的某个元素,去第一个序列里面找结果没找到,这肯定能说明答案就是不是,所以我们只需要正常遍历第二个序列的数据,依次去看这个数据是否存在于第一个序列中,这个过程也需要遍历第一个序列的数据,如果遍历完了发现不存在那就可以证明不是,由于栈具有先入后出的特点,所以在遍历第一个序列的时候一直到找到指定数据前面的数据都需要先入栈,到这一步就引出了我们的算法需要考虑的另外一个点,遍历第一个序列之前需要先判断栈顶的数据是否是正要找的那个数据,如果不是才需要再去遍历第二个序列。
import java.util.Deque;
import java.util.LinkedList;
public class TwentyTwo {
public static void main(String[] args) {
int arr[] = {1,2,3,4,5};
int brr[] = {4,5,3,2,1};
System.out.println(isRank(arr,brr));
int crr[] = {4,3,5,1,2};
System.out.println(isRank(arr,crr));
int drr[] = {4,3,5,1,22};
System.out.println(isRank(arr,drr));
}
public static boolean isRank(int[] arr,int[] brr) {
if (arr.length != brr.length || arr.length <= 0 || brr.length <= 0) {
return false;
}
Deque stack = new LinkedList<>();
int arrIndex = 0;
for (int i = 0;i<brr.length;i++) {
if (stack.peek() == null || (int) stack.peek() != brr[i]) {
boolean tag = false;
//这里arrIndex的意思是需要接着序列1上次的位置开始遍历
for (int j = arrIndex;j < arr.length;j++,arrIndex++) {
if (arr[j] != brr[i]) {
stack.push((int) arr[j]);
} else {
tag = true;
}
}
if (!tag) {
return false;
}
} else {
stack.pop();
}
}
if (stack.size() > 0) {
return false;
}
return true;
}
}