超链接👇
判断出栈顺序是否合法
运行结果:
思路:先创建一个栈,然后定义两个变量记录压栈出栈次数,栈顶元素和待出元素不相等时压栈,否则出栈。
1.创建一个栈,定义两个变量pushIdx和popIdx用来记录压栈出栈的次数,也用作于下标的记录;
Stack<Integer> s = new Stack<>();
int pushIdx = 0; int popIdx = 0;//记录压栈出栈的次数,也有下标的意思
//栈为空或者栈顶元素和代出栈元素不相同的时候入栈
2.当栈为空的时候或者栈顶元素不等于待出栈元素时压栈 pushIdx++;
while(s.isEmpty() || s.peek() != popA[popIdx]){
if(pushIdx < pushA.length){//压栈次数小于pushA长度时压栈
s.push(pushA[pushIdx++]);//pushIdx++ 记录次数
//pushIdx在最后一个元素压栈完成后,++ 等于5
}else{
return false;
//pushIdx=5 时 而peek!=pop[popIdx] 则是不可能的出栈顺序
}
3.否则就出栈,popIdx++;
while(popIdx < popA.length){
while(s.isEmpty() || s.peek() != popA[popIdx]){
if(pushIdx < pushA.length){//压栈次数小于pushA长度时压栈
s.push(pushA[pushIdx++]);//pushIdx++ 记录次数
//pushIdx在最后一个元素压栈完成后,++ 等于5
}else{
return false;
//pushIdx=5 时 而peek!=pop[popIdx] 则是不可能的出栈顺序
}
}
s.pop();
popIdx++;
}
以上
完整代码如下:
import java.util.*;
import java.util.ArrayList;
public class Solution {
public boolean IsPopOrder(int [] pushA,int [] popA) {
Stack<Integer> s = new Stack<>();
int pushIdx = 0; int popIdx = 0;//记录压栈出栈的次数,也有下标的意思
//栈为空或者栈顶元素和代出栈元素不相同的时候入栈
while(popIdx < popA.length){
while(s.isEmpty() || s.peek() != popA[popIdx]){
if(pushIdx < pushA.length){//压栈次数小于pushA长度时压栈
s.push(pushA[pushIdx++]);//pushIdx++ 记录次数
//pushIdx在最后一个元素压栈完成后,++ 等于5
}else{
return false;
//pushIdx=5 时 而peek!=pop[popIdx] 则是不可能的出栈顺序
}
}
s.pop();
popIdx++;
}
return true;
}
}