// Week 7 – Checking brackets with a stack
// Run: go run ./w07/brackets
package main

import "fmt"

func balanced(s string) bool {
	pair := map[rune]rune{')': '(', ']': '[', '}': '{'}
	var st []rune
	for _, c := range s {
		switch c {
		case '(', '[', '{':
			st = append(st, c)
		case ')', ']', '}':
			if len(st) == 0 || st[len(st)-1] != pair[c] {
				return false
			}
			st = st[:len(st)-1]
		}
	}
	return len(st) == 0
}

func main() {
	for _, t := range []string{"(a + b) * [c - d]", "{[()()]}", "([)]", "((a + b)", "a + b)", ""} {
		res := "correct"
		if !balanced(t) {
			res = "WRONG"
		}
		fmt.Printf("%-20q %s\n", t, res)
	}
}
