題目:輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)
思路:憑眼神觀察,先看右邊彈出順序,比如先彈出4,那麼根據入棧順序,1,2,3必定在4後面彈出,再彈出5,那麼1,2,3必定在5後面彈出,此時4已經判斷過,故忽略。再彈出3,那麼根據入棧順序,1,2,必定在3右邊。。。。因為有需要忽略的數字,所以需要乙個資料結構來存數這組資料。
public
class
solution
for(int i=0;i//對右邊陣列迴圈,判斷每個資料的順序
if(!checkorder(pusha,popa,i))
}return result;
}public
boolean
checkorder(int pusha,int popa,int index)
}if(pushaindex==-1)
for(int i=0;i<=pushaindex;i++)
}if(!contains&&!skip.contains(pusha[i]))
}if(pushaindex!=0)
return
true;
}}
上面的方法邏輯比較混亂,不提倡。既然是壓棧彈棧,那就用棧來解決問題。
比如入棧順序[1,2,3,4,5],出棧順序[4,5,3,2,1],我先對第乙個陣列進行入棧,並定義乙個下標指向第二個陣列的頭元素。
當入棧到4時,發現4是第乙個出棧的,那麼立即對4進行出棧,然後下標前移,對5入棧,發現5是當前要出棧的,則立刻對5出棧,下標再前移。陣列1入棧完成,現在棧裡面還有3個元素,一一出棧,如果能與陣列2一一對應,那麼代表這種入棧和出棧順序是合理的。
比如入棧順序[1,2,3,4,5],出棧順序[4,3,5,2,1]按上面的順序,所有元素入棧完後,棧中應該有4個元素,[1,2,3,5],此時一一出棧和[3,5,2,1]不能對應。則為不可能序列。
public
class solution
j++;
}//如果入棧完成但出棧的下標還沒走到尾,說明入棧和出棧順序不同,此時棧中應該還有資料。
//但是,這個時候的出棧順序已經是固定的了。(這一點很重要)
//如果是可能的出棧序列,在上面的迴圈中我們已經把浮動的部分進行了出棧,下面要看的是固定的部分。
//也就是這種入棧方式除開浮動的部分只能按固定順序出棧,如果出現出棧的值和給定的出棧下標的值不等,則返回false,不可能出現這種出棧方式。讀者可自行實驗。
while(iint val = stack.pop();//出棧
if(val!=popa[i])
i++;
}return result;
}public
static
class stack
public
intpop()
return result;
}public
intgettop()
return result;}}
}
棧的壓入彈出序列
題目 輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓棧序列,序列4,5,3,2,1是該棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。解答 可以用乙個輔助的棧來儲存入...
棧的壓入 彈出序列
輸入兩個整數序列,第乙個序列表示棧的壓入順序,判斷兩個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1 2 3 4 5是某棧的壓棧序列,序列4 5 3 2 1是該壓棧序列對應的乙個彈出序列,但4 3 5 1 2就不可能是該壓棧序列的彈出序列。bool ispoporder cons...
棧的壓入彈出序列
1.問題描述 輸入兩個整數序列,第乙個序列表示棧的壓入序列,請判斷第二個序列是否為該棧的彈出序列。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓棧序列,序列4,5,3,2,1是該棧序列對應的乙個彈出序列,但 4,3,5,1,2,就不可能是該壓棧序列的彈出序列。來自 劍指offer...