-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbalanced-brackets.go
119 lines (96 loc) · 1.52 KB
/
balanced-brackets.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package main
import (
"fmt"
"sync"
)
func main() {
var turn int
fmt.Scan(&turn)
for i := 0; i < turn; i++ {
var brackets string
fmt.Scan(&brackets)
if (isBalanced(brackets)) {
fmt.Println("YES")
} else {
fmt.Println("NO")
}
}
}
func isBalanced(expression string) bool {
// Must be even
if ((len(expression) & 1) == 1) {
return false
} else {
brackets := [] rune(expression)
s := NewRuneStack()
for _, bracket := range brackets {
switch (bracket) {
case '{':
s.pushRune('}')
break
case '(':
s.pushRune(')')
break
case '[':
s.pushRune(']')
break
default :
if (s.isEmptyRune() || bracket != s.popRune()) {
return false
}
}
}
return s.isEmptyRune();
}
}
type runeNode struct {
data rune
next *runeNode
}
type Stack struct {
top *runeNode
count int
lock *sync.Mutex
}
func runeNode(item rune) *runeNode {
return &runeNode{
data:item,
}
}
func NewRuneStack() *Stack {
s := &Stack{}
s.lock = &sync.Mutex{}
return s
}
func (s *Stack) isEmptyRune() bool {
return s.top == nil
}
func (s *Stack) peekRune() rune {
s.lock.Lock()
defer s.lock.Unlock()
n := s.top
return n.data
}
func (s *Stack) pushRune(data rune) {
s.lock.Lock()
defer s.lock.Unlock()
n := runeNode(data)
if s.top == nil {
s.top = n
} else {
n.next = s.top
s.top = n
}
s.count++
}
func (s *Stack) popRune() rune {
s.lock.Lock()
defer s.lock.Unlock()
var n *runeNode
if (s.top != nil) {
n = s.top
s.top = n.next
s.count --
}
return n.data
}