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); } }