標籤:
題目:輸入兩個整數序列。其中一個序列表示棧的push 順序,判斷另一個序列有沒有可能是對應的pop 順序。
為了簡單起見,我們假設push 序列的任意兩個整數都是不相等的。
比如輸入的push 序列是1、2、3、4、5,那麼4、5、3、2、1 就有可能是一個pop 系列,但序列4、3、5、1、2 就不可能是push 序列1、2、3、4、5 的pop 序列。
分析:
我們首先定義遍曆push的序數i=0 遍曆pop序列的序數 j =0
我們可以先遍曆給出的push序列,並且時刻與pop序列的頭元素pop[j]進行比較
若找到與pop序列的頭元素相同的push元素,則j向右移一位(移動完成後需要比較pop[j] 與當前的棧頂元素是不是相等,若相等則需要退出當前棧頂元素)
若push已經遍曆完成,但是j依然小於 pop的元素個數,則我們只需要繼續比較pop中剩餘的元素與當前棧中的元素是不是對應的即可
代碼:
func judgeStackOrder(var pushArray:Array<Int>,var popArray:Array<Int>)->Bool{
var tempStack = Stack<Int>() //構造一個tempStack的臨時棧
if(pushArray == [] || popArray == []){
return false
}
if(pushArray.count != popArray.count){
return false
}
var i = 0,j = 0
for(i; i < pushArray.count ; i++){
println(i)
if(pushArray[i] != popArray[j]){
println(pushArray[i])
tempStack.push(pushArray[i])
}
else{
tempStack.push(pushArray[i])
tempStack.pop()
if(tempStack.top() == popArray[j+1]){
tempStack.pop()
j++
}
j++
}
}
if(j < popArray.count){
while( j < popArray.count ){
if(tempStack.top() != popArray[j] ){
println(tempStack.top())
popArray[j]
return false
}
else{
tempStack.pop()
j++
continue //若當前棧頂元素等於當前j所處的pop序列的元素,則臨時棧退棧,並且使j向右移動一個單位,跳入下一輪迴圈
}
}
return true
}
return false
}
//測試代碼
var pushArray:Array<Int> = [1,3,5,7,9,8]
var popArray:Array<Int> = [3,1,9,8,7,5]
judgeStackOrder(pushArray, popArray)
Swift處理堆棧問題——給定兩組序列,其中一個序列表示棧的push 順序,判斷另一個序列有沒有可能是對應的pop 順序