1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#![allow(dead_code)]

pub fn eval_rpn(tokens: Vec<String>) -> i32 {
    let mut stack: Vec<i32> = vec![];
    let add = String::from("+");
    let sub = String::from("-");
    let mul = String::from("*");
    let div = String::from("/");

    for token in tokens {
        if token == add || token == sub || token == mul || token == div {
            let b = stack.pop().unwrap();
            let a = stack.pop().unwrap();
            let c;
            if token == add {
                c = a + b;
            } else if token == sub {
                c = a - b;
            } else if token == mul {
                c = a * b;
            } else {
                c = a / b;
            }

            stack.push(c);
        } else {
            stack.push(token.parse().unwrap());
        }
    }
    stack.pop().unwrap()
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test1() {
        let ss = vec!["4", "13", "5", "/", "+"];
        let mut tokens = vec![];
        for s in ss {
            tokens.push(String::from(s));
        }

        assert_eq!(eval_rpn(tokens), 6);
    }
}