Skip to content

Commit d9bf04c

Browse files
authored
Update algorithm7.rs
1 parent f34dcd1 commit d9bf04c

File tree

1 file changed

+39
-9
lines changed

1 file changed

+39
-9
lines changed

exercises/algorithm/algorithm7.rs

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
This question requires you to use a stack to achieve a bracket match
44
*/
55

6-
// I AM NOT DONE
76
#[derive(Debug)]
87
struct Stack<T> {
98
size: usize,
@@ -31,9 +30,11 @@ impl<T> Stack<T> {
3130
self.size += 1;
3231
}
3332
fn pop(&mut self) -> Option<T> {
34-
// TODO
35-
None
36-
}
33+
if self.size > 0 {
34+
self.size -= 1;
35+
}
36+
self.data.pop()
37+
}
3738
fn peek(&self) -> Option<&T> {
3839
if 0 == self.size {
3940
return None;
@@ -99,12 +100,41 @@ impl<'a, T> Iterator for IterMut<'a, T> {
99100
}
100101
}
101102

102-
fn bracket_match(bracket: &str) -> bool
103-
{
104-
//TODO
105-
true
103+
fn is_pair(l: char, r: char) -> bool {
104+
match (l, r) {
105+
('(', ')') => true,
106+
('[', ']') => true,
107+
('{', '}') => true,
108+
_ => false,
109+
}
110+
}
111+
112+
fn bracket_match(bracket: &str) -> bool {
113+
let mut bracket_set = std::collections::HashSet::new();
114+
115+
bracket_set.insert('(');
116+
bracket_set.insert(')');
117+
bracket_set.insert('[');
118+
bracket_set.insert(']');
119+
bracket_set.insert('{');
120+
bracket_set.insert('}');
121+
122+
let mut stack = Stack::new();
123+
bracket
124+
.chars()
125+
.filter(|c| bracket_set.contains(c))
126+
.for_each(|c| {
127+
if stack.peek().is_some_and(|&p| is_pair(p, c)) {
128+
stack.pop();
129+
} else {
130+
stack.push(c);
131+
}
132+
});
133+
134+
stack.size == 0
106135
}
107136

137+
108138
#[cfg(test)]
109139
mod tests {
110140
use super::*;
@@ -139,4 +169,4 @@ mod tests {
139169
let s = "";
140170
assert_eq!(bracket_match(s),true);
141171
}
142-
}
172+
}

0 commit comments

Comments
 (0)