单调栈(Monotonic Stack)是一种特殊的数据结构,用于解决一些与单调性相关的问题。它的特点是栈内的元素保持单调递增或单调递减的顺序。
单调栈通常基于普通栈实现,但在插入元素时,会根据特定规则进行调整,以保持单调性。常用于解决一些与单调性相关的问题。Go语言提供了灵活的数据结构和操作,使得实现单调栈变得相对简单。下面是一个简单的示例,演示了如何使用Go语言实现单调栈。
package main
import (
"fmt"
)
// 定义栈结构
type Stack struct {
data []int
}
// 入栈
func (s *Stack) Push(val int) {
s.data = append(s.data, val)
}
// 出栈
func (s *Stack) Pop() int {
if len(s.data) == 0 {
return -1 // 栈为空
}
val := s.data[len(s.data)-1]
s.data = s.data[:len(s.data)-1]
return val
}
// 获取栈顶元素
func (s *Stack) Top() int {
if len(s.data) == 0 {
return -1 // 栈为空
}
return s.data[len(s.data)-1]
}
// 判断栈是否为空
func (s *Stack) IsEmpty() bool {
return len(s.data) == 0
}
// 单调栈函数
func MonotonicStack(arr []int) {
stack := Stack{} // 创建一个空栈
// 遍历数组元素
for i := 0; i < len(arr); i++ {
// 如果栈不为空且当前元素小于栈顶元素,则栈顶元素出栈
for !stack.IsEmpty() && arr[i] < stack.Top() {
fmt.Println(stack.Pop())
}
// 当前元素入栈
stack.Push(arr[i])
}
// 处理栈中剩余的元素
for !stack.IsEmpty() {
fmt.Println(stack.Pop())
}
}
func main() {
arr := []int{3, 1, 4, 2, 5}
MonotonicStack(arr)
}
在上述示例中,我们定义了一个Stack结构,它包含一个data切片用于存储栈元素。栈结构提供了入栈、出栈、获取栈顶元素和判断栈是否为空等基本操作。
然后,我们定义了一个MonotonicStack函数,用于实现单调栈。在遍历数组元素的过程中,如果栈不为空且当前元素小于栈顶元素,我们将栈顶元素出栈并打印。然后,将当前元素入栈。最后,我们处理栈中剩余的元素,将其出栈并打印。
在main函数中,我们创建了一个数组arr,并调用MonotonicStack函数来演示单调栈的使用。运行程序后,将会按照单调递减的顺序打印出数组元素。在该示例中,单调栈用于找出数组中每个元素右侧第一个比它小的元素。