Valid Parentheses

Solution in Go

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.

Subscribe via email

Get notified once/twice per month when new articles are published.

Copyright © 2022 - 2024 TheDeveloperCafe.
The Go gopher was designed by Renee French.