Implement RPN
This commit is contained in:
+44
-1
@@ -1,4 +1,4 @@
|
|||||||
use core::fmt;
|
use std::collections::HashMap;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
|
|
||||||
@@ -13,6 +13,7 @@ fn main() {
|
|||||||
stdin.read_line(&mut buffer).unwrap();
|
stdin.read_line(&mut buffer).unwrap();
|
||||||
|
|
||||||
let tokens = tokenisator(&buffer);
|
let tokens = tokenisator(&buffer);
|
||||||
|
let rpn = to_rpn(tokens);
|
||||||
|
|
||||||
buffer.clear();
|
buffer.clear();
|
||||||
}
|
}
|
||||||
@@ -63,7 +64,49 @@ fn tokenisator(task: &str) -> Vec<Token> {
|
|||||||
return tokens;
|
return tokens;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn to_rpn(tokens: Vec<Token>) -> Vec<Token> {
|
||||||
|
let mut out_buf = Vec::<Token>::new();
|
||||||
|
let mut act_buf = Vec::<Token>::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(Debug)]
|
||||||
|
#[derive(Eq, Hash, PartialEq)]
|
||||||
enum Token {
|
enum Token {
|
||||||
Number(i32),
|
Number(i32),
|
||||||
Addition,
|
Addition,
|
||||||
|
|||||||
Reference in New Issue
Block a user