enum Bracket: Character {
case Left = "("
case Right = ")"
case LeftCurly = "{"
case RightCurly = "}"
case LeftSquare = "["
case RightSquare = "]"
/// For a closing bracket, the corresponding opening bracket is returned.
/// For an opening bracket, `nil` is returned.
var matchingOpen: Bracket? {
switch self {
case .Right: return .Left
case .RightCurly: return .LeftCurly
case .RightSquare: return .LeftSquare
default: return nil
}
}
}
And nowNow the isBalanced() function becomes even more readabledoes not use any explicit bracket values anymore:
func isBalanced(sequence: [Character]) -> Bool {
var stack = [Bracket]()
for elem in sequence {
if let bracket = Bracket(rawValue: elem) {
switchif let open = bracket.matchingOpen {
case .Left, .LeftCurly, .LeftSquare // `bracket` is a closing bracket and `open` the corresponding opening bracket:
guard let last = stack.append(bracket)
last where last == open else {
case .Right, .RightCurly, .RightSquare:
return false
if let last = stack.last where last == bracket.matchingOpen {
}
stack.removeLast()
} else {
// `bracket` is an returnopening falsebracket:
}stack.append(bracket)
}
} else {
fatalError("unknown bracket found")
}
}
return stack.isEmpty
}
If you decide to add another type of brackets later (e.g. «») then only the
enumeration needs to be extended, but not the isBalanced() function.