#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,t,f = 1;
bool flag;
stack<int>num;
stack<char>op;
char expr[10010];
int sum[10010];
int lvl(char op){
if(op == '+' || op == '-') return 1;
if(op == '*' || op == '/') return 2;
if(op == '^') return 3;
return 0;
}
int pow(int x,int y){
int res = 1;
for(int i = 1; i <= y; i++) res *= x;
return res;
}
void calc(){
int y = num.top();num.pop();
int x = num.top();num.pop();
switch(op.top()){
case '+':num.push(x + y);break;
case '-':num.push(x - y);break;
case '*':num.push(x * y);break;
case '/':num.push(x / y);break;
case '^':num.push(pow(x,y));break;
}
op.pop();
}
int main(){
scanf("%s",expr + 1);
n = strlen(expr + 1) - 1;
for(int i = 1; i <= n; i++){
sum[i] = sum[i - 1];
if(expr[i] == '(') sum[i]++;
if(expr[i] == ')') sum[i]--;
}
for(int i = 2; i <= n; i++){
if(lvl(expr[i]) && lvl(expr[i - 1]) && expr[i] != '-'){
flag = 1;break;
}
}
if(lvl(expr[n])) flag = 1;
if((n == 1 && lvl(expr[1])) || sum[n] || flag) return 0 * puts("NO");
for(int i = 1; i <= n; i++){
if((i == 1 || !isdigit(expr[i - 1])) && expr[i] == '-'){
f = -1;continue;
}
if(isdigit(expr[i])) t = t * 10 + expr[i] - 48,flag = 1;
else{
if(flag) num.push(t * f),t = flag = 0,f = 1;
if(expr[i] == '('){op.push('(');continue;}
if(expr[i] == ')'){
while(op.top() != '(') calc();
op.pop();
continue;
}
while(!op.empty() && lvl(op.top()) >= lvl(expr[i])) calc();
op.push(expr[i]);
}
}
if(flag) num.push(t * f);
while(!op.empty()) calc();
printf("%d",num.top());
}
80pts代码