summaryrefslogtreecommitdiff
path: root/go/bracket-push/bracket_push.go
diff options
context:
space:
mode:
Diffstat (limited to 'go/bracket-push/bracket_push.go')
-rw-r--r--go/bracket-push/bracket_push.go41
1 files changed, 41 insertions, 0 deletions
diff --git a/go/bracket-push/bracket_push.go b/go/bracket-push/bracket_push.go
new file mode 100644
index 0000000..5c8d7e9
--- /dev/null
+++ b/go/bracket-push/bracket_push.go
@@ -0,0 +1,41 @@
+package brackets
+
+const testVersion = 3
+
+type Stack []rune
+
+func (s *Stack) Push(r rune) {
+ *s = append(*s, r)
+}
+
+func (s *Stack) Pop() (r rune) {
+ r, *s = (*s)[len(*s)-1], (*s)[:len(*s)-1]
+ return
+}
+
+func (s *Stack) Len() int {
+ return len(*s)
+}
+
+func Bracket(s string) (bool, error) {
+ var st Stack
+ pair := map[rune]rune{
+ '}': '{',
+ ']': '[',
+ ')': '(',
+ }
+ for _, v := range s {
+ switch v {
+ case '{', '[', '(':
+ st.Push(v)
+ case '}', ']', ')':
+ if st.Len() == 0 {
+ return false, nil
+ }
+ if r := st.Pop(); r != pair[v] {
+ return false, nil
+ }
+ }
+ }
+ return st.Len() == 0, nil
+}