package main import ( "fmt" ) type MinStack struct { stack1 []int stack2 []int } func Construct() *MinStack { return &MinStack{ stack1: make([]int, 0), // 正常栈的使用 stack2: make([]int, 0), // 保存stack1当前的最小值,弹出值时,弹出当前最小值即可 } } func min(a, b int) int { if a<b { return a } return b } func (m *MinStack) Add(num int) { m.stack1 = append(m.stack1, num) if len(m.stack2) == 0 { m.stack2 = append(m.stack2, num) } else { m.stack2 = append(m.stack2, min(num, m.stack2[len(m.stack2)-1])) } } func (m *MinStack) Pop() int { num := m.stack1[len(m.stack1)-1] m.stack1 = m.stack1[:len(m.stack1)-1] m.stack2 = m.stack2[:len(m.stack2)-1] return num } func (m *MinStack) GetMin() int { return m.stack2[len(m.stack2)-1] } func main() { opts := 0 for { n, _ := fmt.Scan(&opts) if n == 0 { break } else { minstack := Construct() for i:=0; i<opts; i++ { var ops string fmt.Scan(&ops) if ops == "push" { opnum := 0 fmt.Scan(&opnum) minstack.Add(opnum) } else if ops == "getMin" { fmt.Println(minstack.GetMin()) } else { // pop 操作 minstack.Pop() } } } } }