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()
}
}
}
}
}