This repository was archived by the owner on Nov 4, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 46
/
Copy pathbrackets.go
84 lines (72 loc) · 1.58 KB
/
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
package main
import (
"errors"
"strings"
)
var openingBrackets = [...]rune{'(', '[', '{', '<', '«'}
var closingBrackets = [...]rune{')', ']', '}', '>', '»'}
var inconsistentError = errors.New("Stack is inconsistent")
var emptyError = errors.New("Stack is empty")
var ignoredStrings = [...]string{":(", ":-("}
type bracketsStack []rune
func (a *bracketsStack) pop() (rune, error) {
var s rune
if len(*a) < 1 {
return s, emptyError
} else {
s = (*a)[len(*a)-1]
*a = (*a)[:len(*a)-1]
return s, nil
}
}
func (a *bracketsStack) push(s rune) {
*a = append(*a, s)
}
func (a *bracketsStack) processSymbol(s rune) error {
for _, opening_bracket := range openingBrackets {
if s == opening_bracket {
a.push(s)
}
}
for i, closing_bracket := range closingBrackets {
if s == closing_bracket {
opening_bracket, err := a.pop()
if err != nil {
return err
}
if opening_bracket != openingBrackets[i] {
return inconsistentError
}
}
}
return nil
}
func (a bracketsStack) getResult() []rune {
runes := []rune{}
for {
s, err := a.pop()
if err != nil {
break
}
for i, opening_bracket := range openingBrackets {
if s == opening_bracket {
runes = append(runes, closingBrackets[i])
}
}
}
return runes
}
func processString(str string) (string, error) {
for _, x := range ignoredStrings {
str = strings.Replace(str, x, "", -1)
}
runes := []rune(str)
brackets_stack := bracketsStack{}
for _, s := range runes {
err := brackets_stack.processSymbol(s)
if err != nil {
return "", err
}
}
return string(brackets_stack.getResult()), nil
}