Pagini recente » Cod sursa (job #2700177) | Cod sursa (job #573425) | Cod sursa (job #2626798) | Cod sursa (job #2584250) | Cod sursa (job #1798266)
#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<char>> ops;
inline int is(string &op, int loc,int st,int dr) {
return op[0] == gb[loc];
}
inline int make(char 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(gb[i] == op) {
return make(op,eval(st,i-1,t),eval(i+1,dr,t));
}
}
}
}
if(gb[st] == '(') {
return eval(st+1,dr-1,0);
}
return getnum(st,dr);
}
void init() {
ops.pb(vector<char>({'+','-'})); // 4
ops.pb(vector<char>({'/','*'})); // 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;
}