#include <iostream>
#include <vector>
#include <stack>
using namespace std;
//弹出一个运算符和两个操作数,计算后的结果压入操作数栈
void compute_num_symbol (stack<int>& num, stack<char>& symbol) {
//运算符出栈
char sign = symbol.top();
symbol.pop();
//操作数出栈,先弹出的为右操作数,后弹出的为左操作数
int num1 = num.top(); //右操作数
num.pop();
int num2 = num.top(); //左操作数
num.pop();
//计算【左操作数 运算符 右操作数】
int res;
switch (sign) {
case '+':
res = num2 + num1;
break;
case '-':
res = num2 - num1;
break;
case '*':
res = num2 * num1;
break;
case '/':
res = num2 / num1;
break;
default:
break;
}
num.push(res);//结果压入操作数栈
}
//判断运算符优先级,乘除为2,加减为1
int priority (char c) {
if (c == '*' || c == '/')
return 2;
else
return 1;
}
//计算中缀表达式
int count_expression (string str) {
stack<int> number; //操作数栈
stack<char> sign; //运算符栈
//如果开始或左括号后直接跟“-”号,补0(即-4变0-4),这一步是必须的
for (int i = 0; i < str.length(); ++i) {
if (i == 0 && str[i] == '-')
str = "0" + str;
else if (str[i] == '-' && (str[i - 1] == '(' || str[i - 1] == '[' ||
str[i - 1] == '{'))
str.insert(i, "0");
}
bool flag =
false; //前一位为符号位是false,为数位是true(用于计算多位数)
for (char c : str) {
//当扫描到操作数时,将操作数压入操作数栈
if (c >= '0' && c <= '9') {
//前一位为符号位,则直接压入本位
if (!flag) {
flag = true;
number.push(c - '0');
}
//前一位为数位,则将上一个数出栈,乘10,再加上本位
else {
int num = number.top() * 10 + (c - '0');
number.pop();
number.push(num); //新数入栈
}
}
//当扫描到运算符时
else {
flag = false;
if (c == '(' || c == '[' || c == '{')
sign.push(c);//扫描到左括号,入栈
else if (c == ')' || c == ']' ||
c == '}') {//当扫描到右括号时,依次弹出栈内的运算符,直到弹出左括号时结束
//当栈顶不是左括号时,继续弹出运算符计算
while (sign.top() != '(' && sign.top() != '[' &&
sign.top() != '{') {
compute_num_symbol(number, sign);
}
sign.pop();//弹出左括号
} else { //当扫描到+ - * /
while (!sign.empty()) {
if (sign.top() == '(' || sign.top() == '[' || sign.top() == '{')
break;
if (priority(sign.top()) >= priority(
c)) //栈顶运算符的优先级大于等于当前的运算符,弹出运算符计算
compute_num_symbol(number, sign);
else
break; //否则结束弹出
}
sign.push(c); //当前运算符入栈
}
}
}
//将剩下的运算符全部弹出
while (!sign.empty()) {
compute_num_symbol(number, sign);
}
int result = number.top();
return result;
}//计算中缀表达式
int main () {
string str;
cin >> str;
cout << count_expression(str) << endl;
return 0;
}