题目的链接在这里:https://leetcode-cn.com/problems/validate-stack-sequences/
题目大意
给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。一、示意图
二、解题思路
java实现
代码如下:
class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
//正常的思路就是,把push里的数组一个个放入到栈中,直到出现第一个等于poped数组的值
//找到之后,就看下一个和栈顶元素一不一样,如果不一样,就再把push数组放入到栈中
//先把pop的定位到第一个上,然后开始遍历push
//可以这样子判断,一个是stack的栈顶元素和下一个pop元素的对比,和push有下一个,的这个下一个和pop的下一个进行对比
Stack<Integer> stack=new Stack<Integer>();
int j=0;//用来定位pop
//先进行一个极端判断
if(pushed.length==1)
return true;
//开始遍历
for(int i=0;i<pushed.length;i++){
//如果数组的值一直不等于pop的,就一直进栈
if(pushed[i]!=popped[j]) {
stack.push(pushed[i]);
}
//如果开始相等了
else{
int rei=i;
int rej=j;
//如果相等了,而且还没进栈,那就分两个条件判断
//如果栈的栈顶元素是等于pop当前位置的话,那就出栈,然后指向下一个
if(rej< popped.length-1&&!stack.isEmpty()&&stack.peek()==popped[++rej]){
//这个条件如果满足的话,就出栈,然后j加一
stack.pop();
j++;
continue;
}
//下一个条件 如果push这个位置等于
//这个--是为了满足前面那个if判断之后的消除情况,都是消除对应的情况发生
rej--;
rei--;
if(rej<pushed.length-1&&pushed[++rei]==popped[++rej]){
//这个条件下就没什么是吧
//这个应该不用了吧 i++;
j++;
continue;
}
else{
return false;
}
}
}
//如果他不空的话,就调用一下
if(!stack.isEmpty()) {
//这个for循环结束之后,就需要判断栈顶元素和之后的数组之间的关系
for(int q=j;q<popped.length;q++){
if(popped[q]==stack.peek()){
stack.pop();
}
}
}
return stack.isEmpty();
}
}