这是某资讯APP公司的面试题。
数1,2,3,...,n按从小到大的顺序入栈,给定一个序列,判断其是否为一个正确的出栈序列。比如 n=5,则“1,4,3,5,2”是一个正确的出栈序列,而“5,4,3,1,2”不是。
方法是用一个辅助栈保存原栈中未出栈的数(当前的数大于之前出栈的最大值时);遇到下一个数时,判断其是否符合出栈规则。代码如下
package main
func rightOrder(arr []int) bool {
l := len(arr)
if l <= 2 {
return true
}
var maxPre int // 记录之前出栈的最大值
var stack []int // 未出栈的数保存在辅助栈 stack 中
for i := 0; i < l; i++ {
if arr[i] > maxPre+1 {
for tmp := maxPre + 1; tmp < arr[i]; tmp++ {
stack = append(stack, tmp)
}
maxPre = arr[i]
} else if arr[i] == maxPre+1 {
maxPre = arr[i]
} else {
if len(stack) > 0 && arr[i] == stack[len(stack)-1] {
stack = stack[:len(stack)-1]
} else {
return false
}
}
}
return true
}
func main() {
arr := []int{1, 4, 3, 5, 2}
fmt.Println(rightOrder(arr))
}