use std::io::{self, *};
fn calculate(n1: i32, n2: i32, op: &char) -> i32 {
match *op {
'+' => n1 + n2,
'-' => n2 - n1,
'*' => n1 * n2,
'/' => n2 / n1,
_ => -1
}
}
fn parse_expr(line: &mut String) -> i32 {
let mut num_stack = Vec::new();
let mut op_stack = Vec::new();
let mut current_num: Option<i32> = None;
let mut line = format!("{} ", line);
for c in line.chars() {
if let Some(digit) = c.to_digit(10) {
let n = current_num.get_or_insert(0);
*n = *n * 10 + digit as i32
} else {
if let Some(num) = current_num.take() {
num_stack.push(num);
}
match c {
'+' | '-' => {
while let Some(op_on_top) = op_stack.pop() {
let num1 = num_stack.pop().unwrap();
let num2 = num_stack.pop().unwrap();
let res = calculate(num1, num2, &op_on_top);
num_stack.push(res);
}
op_stack.push(c);
},
'*' | '/' => {
while let Some(&op_on_top) = op_stack.last() {
if op_on_top == '*' || op_on_top == '/' {
let op = op_stack.pop().unwrap();
let num1 = num_stack.pop().unwrap();
let num2 = num_stack.pop().unwrap();
num_stack.push(calculate(num1, num2, &op));
} else {
break;
}
}
op_stack.push(c);
},
_ => continue,
}
}
}
while let Some(op) = op_stack.pop() {
let num1 = num_stack.pop().unwrap();
let num2 = num_stack.pop().unwrap();
let res = calculate(num1, num2, &op );
num_stack.push(res);
}
num_stack.pop().unwrap()
}
fn main() {
let mut stdin = io::stdin();
for line in stdin.lock().lines() {
let mut line = line.unwrap();
if line == "END" {
break;
}
let res = parse_expr(&mut line);
println!("{}", res);
}
}