题目描述
解法思路: 逆向思维
例如pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
过程如下:创建一个空栈,先从popped最后一个元素开始,将它压入栈中,为1,然后判断pushed最后一个元素5和栈顶元素1相不相等,若是则pop出栈,这里不相等,因此将2压入栈中,继续重复比较,直到压入5进栈,此时pushed最后一个元素5和栈顶5相等,因此pop,pop后栈顶为3,4≠3,压入4,然后4=4,pop4,pop后栈顶为3,3=3,pop3,2=2,pop2,1=1,pop1。此时两个数组都遍历完,返回true;
代码如下:
class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
//解法 逆序思维 popped变为该push的元素,pushed变为pop的元素,且都从数组末尾开始操作;若当前栈顶元素
//等于pushed数组的末尾元素,则pop该元素,否则push popped的次末尾元素,直到数组指针指向空值,返回true
//如果栈顶元素不等于pushed数组的(次)末尾元素,且没有可以继续push的元素,则返回false
//为了不混淆,我们更换数组名字
int[] toPush,toPop;
toPush=popped;
toPop=pushed;
int lenPush=toPush.length-1,lenPop=toPop.length-1; //名字换成pushIndex,popIndex更为直观
if(lenPush!=lenPop)
return false;
Stack<Integer> stack=new Stack<Integer>();
if(lenPush==-1) //输入为空时返回true
return true;
stack.push(toPush[lenPush--]); //先压入第一个元素
while(lenPush>=0||lenPop>=0){
if(stack.isEmpty()) //栈空时压入一个元素
stack.push(toPush[lenPush--]);
if(toPop[lenPop]==stack.peek()){ //判断栈顶元素是否等于待pop的元素
stack.pop();
--lenPop;
}else{
if(lenPush<0) //栈顶元素不等于要pop的元素,且没有可以继续入栈的元素,返回false
return false;
stack.push(toPush[lenPush--]);
}
}
return true;
}