剑指offer题解汇总 Java实现
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
-
-
for循环遍历pushA数组
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();
}
}
for循环遍历popA数组
由于 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;
}
}