import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
final Map<Character, Integer> map = new HashMap<>();
map.put('+', 1);
map.put('-', 1);
map.put('*', 2);
map.put('/', 2);
// 多组输入:改用hasNextLine,适配题目每行一组数据的要求
while (sc.hasNextLine()) {
String s = sc.nextLine().trim();
// 跳过空行,避免读取空字符串导致异常
if (s.length() == 0) {
continue;
}
// ============ 漏洞2修复:栈在循环内初始化,每次都是全新空栈 ============
Stack<Integer> nums = new Stack<>();
Stack<Character> ops = new Stack<>();
int x = 0;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (Character.isDigit(c)) {
x = x * 10 + (c - '0');
} else {
nums.push(x);
x = 0;
// ============ 漏洞1核心修复:增加nums.size()>=2判断!!! ============
// 必须同时满足:运算符栈非空 + 数字栈至少2个元素 + 优先级符合 → 才计算
while (!ops.isEmpty() && nums.size() >= 2 && map.get(ops.peek()) >= map.get(c)) {
int b = nums.pop();
int a = nums.pop();
char op = ops.pop();
switch (op) {
case '+': nums.push(a + b); break;
case '-': nums.push(a - b); break;
case '*': nums.push(a * b); break;
case '/': nums.push(a / b); break;
default: break;
}
}
ops.push(c);
}
}
// 处理最后一个数字,强制入栈,避免遗漏
nums.push(x);
// ============ 最终计算:同样增加nums.size()>=2判断,杜绝空栈 ============
while (!ops.isEmpty() && nums.size() >= 2) {
int b = nums.pop();
int a = nums.pop();
char op = ops.pop();
switch (op) {
case '+': nums.push(a + b); break;
case '-': nums.push(a - b); break;
case '*': nums.push(a * b); break;
case '/': nums.push(a / b); break;
default: break;
}
}
// 最终栈里只剩一个结果,直接弹出输出
System.out.println(nums.pop());
}
sc.close();
}
}