https://blog.csdn.net/guliguliguliguli/article/details/126089434
https://www.nowcoder.com/exam/oj/ta?page=1&tpId=13&type=13



for循环来遍历pushA数组:
向stack中添加pushA数组中的值 pushA[i]
判断栈顶元素的值是否与 popA[j] 指向的值相等
不相等的话,继续向stack中添加pushA数组中的值
相等的话,弹出栈顶元素,j+1(即,popA数组的指针向后移一位)
当pushA数组中的值已经全部添加完毕后(即,for循环结束),继续判断stack是否为空
如果stack为空,直接返回true
如果stack不为空
如果stack能按照popA数组剩下的顺序,将stack中的元素,全部弹出,则返回true
如果stack不能按照popA数组剩下的顺序,将stack中的元素全部弹出,则返回false

import java.util.*;
import java.util.ArrayList;
public class Solution {
public boolean IsPopOrder(int[] pushA, int[] popA) {
Stack<Integer> stack = new Stack<>();
//popA数组的指针
int j = 0;
for (int i = 0; i < pushA.length; i++) {
stack.push(pushA[i]);
while (j < popA.length && !stack.isEmpty() && stack.peek() == popA[j]) {
stack.pop();
j++;
}
}
while (j < popA.length && !stack.isEmpty() && stack.peek() == popA[j]){
stack.pop();
j++;
}
return stack.isEmpty();
}
}
由于 j = pushA.length 跳出了while循环说明 pushA数组中的元素已经全部都添加到stack中一遍了
import java.util.*;
import java.util.ArrayList;
public class Solution {
public boolean IsPopOrder(int[] pushA, int[] popA) {
Stack<Integer> stack = new Stack<>();
//pushA数组的指针
int j = 0;
for (int i = 0; i < popA.length; i++) {
while (j < pushA.length && (stack.isEmpty() || stack.peek() != popA[i])) {
stack.push(pushA[j++]);
}
if (stack.peek() == popA[i]) {
stack.pop();
} else {
return false;
}
}
return true;
}
}
方案一使用了一个辅助栈来模拟,但是数组本来就很类似栈啊,用下标表示栈顶。在方案一种push数组前半部分入栈了,就没用了,这部分空间我们就可以用来当成栈。原理还是同方案一一样,只是这时我们遍历push数组的时候,用下标n表示栈空间,n的位置就是栈顶元素。
import java.util.*;
import java.util.ArrayList;
public class Solution {
public boolean IsPopOrder(int[] pushA, int[] popA) {
int n = 0;
int j = 0;
for (int num : pushA) {
pushA[n] = num;
while (n >= 0 && pushA[n] == popA[j]) {
n--;
j++;
}
n++;
}
return n == 0;
}
}