func isValid(s string) bool {
stack := NewStack()
for _, c := range s {
switch c {
case '(', '{', '[':
stack.Push(c)
case ')', '}', ']':
if stack.IsEmpty() {
return false
}
top := stack.Pop()
if (top == '(' && c != ')') ||
(top == '{' && c != '}') ||
(top == '[' && c != ']') {
return false
}
}
}
return stack.IsEmpty()
}
// ---------- Stack Implementation ----------
type Stack struct {
stack []rune
}
func NewStack() *Stack {
return &Stack{
stack: make([]rune, 0),
}
}
func (s *Stack) IsEmpty() bool {
return len(s.stack) == 0
}
func (s *Stack) Push(data rune) {
s.stack = append(s.stack, data)
}
func (s *Stack) Pop() rune {
if len(s.stack) == 0 {
return 0
}
item := s.stack[len(s.stack)-1]
s.stack = s.stack[:len(s.stack)-1]
return item
}
Since Go doesn't have an inbuilt stack, we need to rely on slices. A cleaner solution is to create a new type Stack
that implements Push
, Pop
and IsEmpty
functionality.