Pagini recente » Cod sursa (job #1027486) | Cod sursa (job #682335) | Cod sursa (job #741774) | Cod sursa (job #1824578) | Cod sursa (job #1798265)
#include<bits/stdc++.h>
#include<stdio.h>
#include<cstring>
#include<stdlib.h>
#define pb push_back
using namespace std;
typedef long long ll;
#define fs first
#define sc second
#define mp make_pair
string gb;
int getnum(int st,int dr) {
int ret = 0;
for(int i=st;i<=dr;++i) {
ret *= 10;
ret += (gb[i] -'0');
}
return ret;
}
vector<vector<string>> ops;
inline int is(string &op, int loc,int st,int dr) {
int epos = loc + op.size() - 1;
if(epos > dr) return 0;
int ok = 1;
for(int i=0;i<op.size();++i) {
if(i > dr) return 0;
if(gb[i+loc] != op[i]) ok = 0;
if(!ok) return 0;
}
return 1;
}
inline int make(string &op,int x,int y) {
if(op == "-") return x-y;
if(op == "+") return x+y;
if(op == "/") return x/y;
if(op == "*") return x*y;
}
inline int eval(int st,int dr, int lvl) {
for(int t = lvl;t<ops.size();++t) {
int par = 0;
for(int i = dr;i>=st;--i) {
if(gb[i] == '(') ++ par;
if(gb[i] == ')') -- par;
if(par) continue;
for(auto op : ops[t]) {
if(is(op,i,st,dr)) {
return make(op,eval(st,i-1,t),eval(i+op.size(),dr,t));
}
}
}
}
if(gb[st] == '(') {
return eval(st+1,dr-1,0);
}
return getnum(st,dr);
}
void init() {
ops.pb(vector<string>({"+","-"})); // 4
ops.pb(vector<string>({"/","*"})); // 5
}
char s[202020];
int eval() {
gb = "";
int a = strlen(s);
for(int i = 0;i<a;++i) {
char c = s[i];
if(c != ' ') gb.pb(c);
}
int ret = eval(0,gb.size()-1,0);
return ret;
}
int main() {
freopen("evaluare.in","r",stdin);
//freopen("evaluare.in","r",stdin);
freopen("evaluare.out","w",stdout);
init();
scanf("%s",s);
cout << eval();
return 0;
}