問題形貌
輸入兩個整數序列,第一個序列示意棧的壓入遞次,請推斷第二個序列是不是為該棧的彈出遞次。假定壓入棧的一切数字均不相稱。比方序列1,2,3,4,5是某棧的壓入遞次,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不多是該壓棧序列的彈出序列。(注重:這兩個序列的長度是相稱的)
剖析
實在該題就是考核一個進棧序列可否和一個出棧序列對應起來,然則辣手的處所在於:一個進棧序列能夠會有多個出棧的遞次,所以照樣得好好想一想。
能夠從一個簡樸的例子最先:
序列A:1,2,3
序列B:2,3,1
1先進棧,B序列中未出棧的第一個数字是2,申明此時1不能再接着出棧;
2再進棧,B序列中未出棧 的第一個数字是2,申明第一個出棧的数字是2,那末2就此出棧;
此時棧頂元素為1,B序列中未出棧的第一個数字是1,申明1是自2出棧后的再一個出棧元素,那末1就此出棧,此時棧為空;
3繼承進棧,此時B序列的中未出棧的第一個数字是3,申明3是再一個出棧元素,那末3就此出棧,此時棧為空,序列A也全都進棧終了了;
棧空了,序列A也進棧終了了,申明B就是A的彈出序列。
代碼完成
接着這個思緒,能夠試着寫代碼了
function IsPopOrder(pushV, popV)
{
if(pushV.length === 0 || popV.length === 0 || pushV.length !== popV.length)
return false;
// 進棧序列和出棧序列離別有一個指針,從頭最先
var curPushIndex = 0, curPopIndex = 0;
var stack = [];
for(;curPushIndex < pushV.length;curPushIndex++) {
stack.push(pushV[curPushIndex]);
while(curPopIndex < popV.length && stack[stack.length-1] === popV[curPopIndex]){
// 棧頂元素和當前popIndex指向的数字一樣的話,stack彈出棧頂元素,且當前popIndex指向pop序列的下一個数字
stack.pop();
curPopIndex++;
}
}
// 棧中元素沒有悉數彈出,申明兩個序列並不婚配,不然,就是婚配
return stack.length === 0;
}