#include <iostream>
#include <string>
#include <stack>
#include <vector>
using namespace std;
#ifdef FIRST_MRTHOD
int i;
/*
思路:当输入字符为‘(’,则进行递归;如果输入字符为数字,将字符串数字转化为整型数字;
如果算数运算符为'+'',则将数字压入队列;
如果算数运算符为'-',则将(-)数字压入队列;
如果算数运算符为'*’,则将弹出栈顶字符与其相乘,将其结果压入栈;
如果算数运算符为'/’,则将弹出栈顶字符其相除,将其结果压入栈;
如果输入字符为‘)’,则进行下一轮运算
将栈的数据相加求和。
*/
int expressionValue(string &expressStr)
{
int len = expressStr.length();
char op = '+';
int num = 0;
stack<int> sta;
while(i < len) {
if (expressStr[i] == '(') {
i++;
num = expressionValue(expressStr);
}
while(i < len && expressStr[i] >= '0' && expressStr[i] <= '9') {
num = num*10 + expressStr[i] - '0';
i++;
}
switch(op) {
case '+' :{
sta.push(num);
break;
}
case '-' : {
sta.push(-num);
break;
}
case '*' :{
int temp = sta.top();
sta.pop();
temp *= num;
sta.push(temp);
break;
}
case '/' :{
int temp = sta.top();
sta.pop();
temp /= num;
sta.push(temp);
break;
}
}
num = 0; //情况数字
op = expressStr[i];
if(expressStr[i] == ')') {
i++;
break;
}
i++;
}
int sum = 0;
while(sta.size()) {
sum += sta.top();
sta.pop();
}
return sum;
}
int main()
{
string expressStr;
while(cin>>expressStr) {
i = 0;
cout<<expressionValue(expressStr)<<endl;
}
}
#else
/*
思路:从头开始变量,遇到字符串数字转化整型数字;若遇到‘(’开始遍历,若再次遇到‘(’层级累加,若遇到‘)’层级减少,知道层级为0;
若遇到运算符,则进行算数运算,得到结果进行下一轮运算。最后对整个数据进行相加求和
*/
int expressionValue(string expressStr, int l, int r)
{
int num = 0;
char op = '+';
vector<int> vec;
for(int i = l; i <= r; i++) {
if(expressStr[i] >= '0' && expressStr[i] <= '9') {
num = num * 10 + expressStr[i] - '0';
}
if (expressStr[i] == '(') {
int layer = 0; //统计左括号层级
int j = i;
while(j <= r) {
if (expressStr[j] == '(') {
layer++;
} else if (expressStr[j] == ')') {
layer--;
if(layer == 0) {
break;
}
}
j++;
}
num = expressionValue(expressStr, i+1, j-1); // 递归括号的部分
i = j + 1;
}
if (!isdigit(expressStr[i]) || i == r) {
switch(op) {
case '+' : {
vec.push_back(num);
break;
}
case '-' : {
vec.push_back(-num);
break;
}
case '*' : {
vec.back() *= num;
break;
}
case '/' : {
vec.back() /= num;
break;
}
}
op = expressStr[i]; // 下一轮的运算符
num = 0;// 清空
}
}
int sum = 0;
for(auto x : vec) {
sum += x;
}
return sum;
}
int main()
{
string expressStr;
while(cin>>expressStr) {
cout<<expressionValue(expressStr, 0, expressStr.length()-1)<<endl;
}
}
#endif