diff --git a/src/main.rs b/src/main.rs index c2a0d42..f82fec2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -use core::fmt; +use std::collections::HashMap; use std::io; use std::io::Write; @@ -13,6 +13,7 @@ fn main() { stdin.read_line(&mut buffer).unwrap(); let tokens = tokenisator(&buffer); + let rpn = to_rpn(tokens); buffer.clear(); } @@ -63,7 +64,49 @@ fn tokenisator(task: &str) -> Vec { return tokens; } +fn to_rpn(tokens: Vec) -> Vec { + let mut out_buf = Vec::::new(); + let mut act_buf = Vec::::new(); + + let priority = HashMap::from([ + (Token::BracketOpen, 0), + (Token::Addition, 1), + (Token::Substruction, 1), + (Token::Multiplication, 2), + (Token::Division, 2), + ]); + + for t in tokens { + match t { + Token::Number(_) => out_buf.push(t), + Token::BracketOpen => act_buf.push(t), + Token::BracketClose => { + while matches!(act_buf.last().unwrap(), Token::BracketOpen) { + out_buf.push(act_buf.pop().unwrap()); + } + act_buf.pop(); + } + _ => { + if !act_buf.is_empty() { + while priority.get(&t).unwrap() < priority.get(act_buf.last().unwrap()).unwrap() { + out_buf.push(act_buf.pop().unwrap()); + if act_buf.is_empty() { break; } + } + } + + act_buf.push(t); + } + } + } + + act_buf.reverse(); + out_buf.append(&mut act_buf); + + return out_buf; +} + #[derive(Debug)] +#[derive(Eq, Hash, PartialEq)] enum Token { Number(i32), Addition,