Implement RPN

This commit is contained in:
2026-06-13 02:03:55 +03:00
parent b82fbc168a
commit 2e7151d8ce
+44 -1
View File
@@ -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,