1
1
/*
2
- stack
3
- This question requires you to use a stack to achieve a bracket match
2
+ stack
3
+ This question requires you to use a stack to achieve a bracket match
4
4
*/
5
5
6
- // I AM NOT DONE
7
6
#[ derive( Debug ) ]
8
7
struct Stack < T > {
9
- size : usize ,
10
- data : Vec < T > ,
8
+ size : usize ,
9
+ data : Vec < T > ,
11
10
}
12
11
impl < T > Stack < T > {
13
- fn new ( ) -> Self {
14
- Self {
15
- size : 0 ,
16
- data : Vec :: new ( ) ,
17
- }
18
- }
19
- fn is_empty ( & self ) -> bool {
20
- 0 == self . size
21
- }
22
- fn len ( & self ) -> usize {
23
- self . size
24
- }
25
- fn clear ( & mut self ) {
26
- self . size = 0 ;
27
- self . data . clear ( ) ;
28
- }
29
- fn push ( & mut self , val : T ) {
30
- self . data . push ( val) ;
31
- self . size += 1 ;
32
- }
33
- fn pop ( & mut self ) -> Option < T > {
34
- // TODO
35
- None
36
- }
37
- fn peek ( & self ) -> Option < & T > {
38
- if 0 == self . size {
39
- return None ;
40
- }
41
- self . data . get ( self . size - 1 )
42
- }
43
- fn peek_mut ( & mut self ) -> Option < & mut T > {
44
- if 0 == self . size {
45
- return None ;
46
- }
47
- self . data . get_mut ( self . size - 1 )
48
- }
49
- fn into_iter ( self ) -> IntoIter < T > {
50
- IntoIter ( self )
51
- }
52
- fn iter ( & self ) -> Iter < T > {
53
- let mut iterator = Iter {
54
- stack : Vec :: new ( )
55
- } ;
56
- for item in self . data . iter ( ) {
57
- iterator. stack . push ( item ) ;
58
- }
59
- iterator
60
- }
61
- fn iter_mut ( & mut self ) -> IterMut < T > {
62
- let mut iterator = IterMut {
63
- stack : Vec :: new ( )
64
- } ;
65
- for item in self . data . iter_mut ( ) {
66
- iterator. stack . push ( item) ;
67
- }
68
- iterator
69
- }
12
+ fn new ( ) -> Self {
13
+ Self {
14
+ size : 0 ,
15
+ data : Vec :: new ( ) ,
16
+ }
17
+ }
18
+ fn is_empty ( & self ) -> bool {
19
+ 0 == self . size
20
+ }
21
+ fn len ( & self ) -> usize {
22
+ self . size
23
+ }
24
+ fn clear ( & mut self ) {
25
+ self . size = 0 ;
26
+ self . data . clear ( ) ;
27
+ }
28
+ fn push ( & mut self , val : T ) {
29
+ self . data . push ( val) ;
30
+ self . size += 1 ;
31
+ }
32
+ fn pop ( & mut self ) -> Option < T > {
33
+ if self . is_empty ( ) {
34
+ None
35
+ } else {
36
+ self . size -= 1 ;
37
+ self . data . pop ( )
38
+ }
39
+ }
40
+ fn peek ( & self ) -> Option < & T > {
41
+ if 0 == self . size {
42
+ return None ;
43
+ }
44
+ self . data . get ( self . size - 1 )
45
+ }
46
+ fn peek_mut ( & mut self ) -> Option < & mut T > {
47
+ if 0 == self . size {
48
+ return None ;
49
+ }
50
+ self . data . get_mut ( self . size - 1 )
51
+ }
52
+ fn into_iter ( self ) -> IntoIter < T > {
53
+ IntoIter ( self )
54
+ }
55
+ fn iter ( & self ) -> Iter < T > {
56
+ let mut iterator = Iter { stack : Vec :: new ( ) } ;
57
+ for item in self . data . iter ( ) {
58
+ iterator. stack . push ( item ) ;
59
+ }
60
+ iterator
61
+ }
62
+ fn iter_mut ( & mut self ) -> IterMut < T > {
63
+ let mut iterator = IterMut { stack : Vec :: new ( ) } ;
64
+ for item in self . data . iter_mut ( ) {
65
+ iterator. stack . push ( item) ;
66
+ }
67
+ iterator
68
+ }
70
69
}
71
70
struct IntoIter < T > ( Stack < T > ) ;
72
71
impl < T : Clone > Iterator for IntoIter < T > {
73
- type Item = T ;
74
- fn next ( & mut self ) -> Option < Self :: Item > {
75
- if !self . 0 . is_empty ( ) {
76
- self . 0 . size -= 1 ; self . 0 . data . pop ( )
77
- }
78
- else {
79
- None
80
- }
81
- }
72
+ type Item = T ;
73
+ fn next ( & mut self ) -> Option < Self :: Item > {
74
+ if !self . 0 . is_empty ( ) {
75
+ self . 0 . size -= 1 ;
76
+ self . 0 . data . pop ( )
77
+ } else {
78
+ None
79
+ }
80
+ }
82
81
}
83
82
struct Iter < ' a , T : ' a > {
84
- stack : Vec < & ' a T > ,
83
+ stack : Vec < & ' a T > ,
85
84
}
86
85
impl < ' a , T > Iterator for Iter < ' a , T > {
87
- type Item = & ' a T ;
88
- fn next ( & mut self ) -> Option < Self :: Item > {
89
- self . stack . pop ( )
90
- }
86
+ type Item = & ' a T ;
87
+ fn next ( & mut self ) -> Option < Self :: Item > {
88
+ self . stack . pop ( )
89
+ }
91
90
}
92
91
struct IterMut < ' a , T : ' a > {
93
- stack : Vec < & ' a mut T > ,
92
+ stack : Vec < & ' a mut T > ,
94
93
}
95
94
impl < ' a , T > Iterator for IterMut < ' a , T > {
96
- type Item = & ' a mut T ;
97
- fn next ( & mut self ) -> Option < Self :: Item > {
98
- self . stack . pop ( )
99
- }
95
+ type Item = & ' a mut T ;
96
+ fn next ( & mut self ) -> Option < Self :: Item > {
97
+ self . stack . pop ( )
98
+ }
100
99
}
101
100
102
- fn bracket_match ( bracket : & str ) -> bool
103
- {
104
- //TODO
105
- true
101
+ fn bracket_match ( bracket : & str ) -> bool {
102
+ let mut stack = Stack :: new ( ) ;
103
+ let matching_brackets = |c : char | match c {
104
+ ')' => '(' ,
105
+ ']' => '[' ,
106
+ '}' => '{' ,
107
+ _ => return c,
108
+ } ;
109
+ for c in bracket. chars ( ) {
110
+ match c {
111
+ '(' | '[' | '{' => stack. push ( c) ,
112
+ ')' | ']' | '}' => {
113
+ if stack. is_empty ( ) || * stack. peek ( ) . unwrap ( ) != matching_brackets ( c) {
114
+ return false ;
115
+ }
116
+ stack. pop ( ) ;
117
+ }
118
+ _ => { }
119
+ }
120
+ }
121
+ stack. is_empty ( )
106
122
}
107
123
108
124
#[ cfg( test) ]
109
125
mod tests {
110
- use super :: * ;
111
-
112
- #[ test]
113
- fn bracket_matching_1 ( ) {
114
- let s = "(2+3){func}[abc]" ;
115
- assert_eq ! ( bracket_match( s) , true ) ;
116
- }
117
- #[ test]
118
- fn bracket_matching_2 ( ) {
119
- let s = "(2+3)*(3-1" ;
120
- assert_eq ! ( bracket_match( s) , false ) ;
121
- }
122
- #[ test]
123
- fn bracket_matching_3 ( ) {
124
- let s = "{{([])}}" ;
125
- assert_eq ! ( bracket_match( s) , true ) ;
126
- }
127
- #[ test]
128
- fn bracket_matching_4 ( ) {
129
- let s = "{{(}[)]}" ;
130
- assert_eq ! ( bracket_match( s) , false ) ;
131
- }
132
- #[ test]
133
- fn bracket_matching_5 ( ) {
134
- let s = "[[[]]]]]]]]]" ;
135
- assert_eq ! ( bracket_match( s) , false ) ;
136
- }
137
- #[ test]
138
- fn bracket_matching_6 ( ) {
139
- let s = "" ;
140
- assert_eq ! ( bracket_match( s) , true ) ;
141
- }
142
- }
126
+ use super :: * ;
127
+
128
+ #[ test]
129
+ fn bracket_matching_1 ( ) {
130
+ let s = "(2+3){func}[abc]" ;
131
+ assert_eq ! ( bracket_match( s) , true ) ;
132
+ }
133
+ #[ test]
134
+ fn bracket_matching_2 ( ) {
135
+ let s = "(2+3)*(3-1" ;
136
+ assert_eq ! ( bracket_match( s) , false ) ;
137
+ }
138
+ #[ test]
139
+ fn bracket_matching_3 ( ) {
140
+ let s = "{{([])}}" ;
141
+ assert_eq ! ( bracket_match( s) , true ) ;
142
+ }
143
+ #[ test]
144
+ fn bracket_matching_4 ( ) {
145
+ let s = "{{(}[)]}" ;
146
+ assert_eq ! ( bracket_match( s) , false ) ;
147
+ }
148
+ #[ test]
149
+ fn bracket_matching_5 ( ) {
150
+ let s = "[[[]]]]]]]]]" ;
151
+ assert_eq ! ( bracket_match( s) , false ) ;
152
+ }
153
+ #[ test]
154
+ fn bracket_matching_6 ( ) {
155
+ let s = "" ;
156
+ assert_eq ! ( bracket_match( s) , true ) ;
157
+ }
158
+ }
0 commit comments