您好,登錄后才能下訂單哦!
小編給大家分享一下golang刷leetcode技巧之如何實現棧的壓入、彈出序列,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如,序列 {1,2,3,4,5} 是某棧的壓棧序列,序列 {4,5,3,2,1} 是該壓棧序列對應的一個彈出序列,但 {4,3,5,1,2} 就不可能是該壓棧序列的彈出序列。
示例 1:
輸入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
輸出:true
解釋:我們可以按以下順序執行:
push(1), push(2), push(3), push(4), pop() -> 4,
push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
示例 2:
輸入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
輸出:false
解釋:1 不能在 2 之前彈出。
提示:
0 <= pushed.length == popped.length <= 1000
0 <= pushed[i], popped[i] < 1000
pushed 是 popped 的排列。
解題思路
1,本題主要考察入棧出棧的理解
2,golang slice可以很容易實現棧
3,每次pushed入棧后popped 進行比較
4,如果棧非空,且poped的當前元素和棧頂元素相等,則出棧,同時右移popped指針
代碼實現
func validateStackSequences(pushed []int, popped []int) bool {
var s stack
j:=0
for i:=0;i<len(pushed);i++{
s.push(pushed[i])
for !s.empty() && s.top()==popped[j]{
s.pop()
j++
//if j<len(popped){
// fmt.Println("inner:",s.data,i,j,popped[j],s.top())
//}
}
//if j<len(popped){
//fmt.Println(s.data,i,j,popped[j])
//}
}
return s.empty() && j==len(popped)
}
type stack struct{
data []int
}
func (s *stack )push(v int){
s.data=append(s.data,v)
}
func (s *stack)pop()int{
v:=s.data[len(s.data)-1]
s.data=s.data[:len(s.data)-1]
return v
}
func(s*stack)top()int{
return s.data[len(s.data)-1]
}
func (s*stack)empty()bool{
return len(s.data)==0
}
看完了這篇文章,相信你對“golang刷leetcode技巧之如何實現棧的壓入、彈出序列”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。