rustgym/leetcode/
_155_min_stack.rs

1#[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}