已知pushed和poped两个序列,如果要判断poped是否能由pushed栈推出生成,我们可以利用逆向思维,如果poped是由pushed出栈推出形成的,那pushed也可以由poped出栈弹出形成,用这个想法来检验结果。
我们需要重新创建一个新的栈堆stack来遍历存储pushed序列,并设置numPUSH和numPOP来记录stack和poped的推出位置,numPOP从零开始表示poped依次推出的数据,在栈堆stack遍历过程中数据如果和poped[numPOP]相等,进入while循环并判断接下来的数据是否相等,如果相等,numPUSH-1表示stack被推出一个数据,同时numPOP+1获取poped下一个推出栈的数据,不相等则退出循环。
function validateStackSequences(pushed: number[], popped: number[]): boolean {
let len:number = pushed.length
let numPOP = 0
let numPUSH = 0
let stack:Array<number> = new Array(len).fill(0)
for( let i = 0;i < len;i++ ) {
stack[numPUSH] = pushed[i]
while(stack[numPUSH]==popped[numPOP]&&numPUSH>=0) {
numPOP++
numPUSH--
}
numPUSH++
}
if(numPOP===len)
return true
else
return false
};
下面是图片显示
讲pushed的数据依次推入stack中
直到出现stack推入的数据和poped推出的数据相等,进入循环后判断5不等于3,中止循环
此时4推出后,5又推进来,判断和poped的推出数据是否相等,相等进入循环依次推出5 3 2 1
继续遍历 ,依照原来的想法弹出7 6,并记录numPOP的数组位置。
循环遍历后判断numPOP是否等于poped序列的数组长度,如果是则poped全部出栈符合题目要求,如果不是则return false。
最后附赠提交截图
入行没多久,还存在很多不足的地方,有错误的地方希望各位多多指正。