package Stack
// Stack is a generic type.
type Stack[T any] []T
func (s *Stack[T]) Size() int {
return len(*s)
}
func (s *Stack[T]) IsEmpty() bool {
return s.Size() == 0
}
func (s *Stack[T]) Push(val T) {
*s = append(*s, val)
}
func (s *Stack[T]) Pop() T {
if s.IsEmpty() {
var zero T
return zero
}
e := (*s)[s.Size()-1]
*s = (*s)[:s.Size()-1]
return e
}
func (s *Stack[T]) Top() T {
if s.IsEmpty() {
var zero T
return zero
}
return (*s)[s.Size()-1]
}
func isValid(s string) bool {
stack := new(Stack[int32])
for _, ch := range s {
if ch == '(' || ch == '[' || ch == '{' {
stack.Push(ch)
} else {
if stack.IsEmpty() {
return false
}
top := stack.Pop()
if !isMatch(top, ch) {
return false
}
}
}
return stack.IsEmpty()
}
func isMatch(left int32, right int32) bool {
if left == '(' {
return right == ')'
} else if left == '[' {
return right == ']'
} else if left == '{' {
return right == '}'
} else {
return false
}
}