rustgym/leetcode/
_155_min_stack.rs1#[derive(Default)]
2struct MinStack {
3 nums: Vec<i32>,
4 mins: Vec<i32>,
5 top: i32,
6 min: i32,
7}
8
9impl MinStack {
10 fn new() -> Self {
11 MinStack {
12 nums: vec![],
13 mins: vec![],
14 top: 0,
15 min: 0,
16 }
17 }
18
19 fn push(&mut self, x: i32) {
20 self.nums.push(x);
21 if let Some(&min) = self.mins.last() {
22 self.mins.push(i32::min(x, min));
23 } else {
24 self.mins.push(x);
25 }
26 self.set_min();
27 self.set_top();
28 }
29
30 fn pop(&mut self) {
31 self.nums.pop();
32 self.mins.pop();
33 self.set_min();
34 self.set_top();
35 }
36
37 fn set_top(&mut self) {
38 self.top = if let Some(&last) = self.nums.last() {
39 last
40 } else {
41 0
42 }
43 }
44
45 fn set_min(&mut self) {
46 self.min = if let Some(&last) = self.mins.last() {
47 last
48 } else {
49 0
50 }
51 }
52
53 fn top(&self) -> i32 {
54 self.top
55 }
56
57 fn get_min(&self) -> i32 {
58 self.min
59 }
60}
61
62#[test]
63fn test() {
64 let mut min_stack = MinStack::new();
65 min_stack.push(-2);
66 min_stack.push(0);
67 min_stack.push(-3);
68 assert_eq!(min_stack.get_min(), -3);
69 min_stack.pop();
70 assert_eq!(min_stack.top(), 0);
71 assert_eq!(min_stack.get_min(), -2);
72}