Pagini recente » Cod sursa (job #2526197) | Cod sursa (job #1657570) | Cod sursa (job #2665470) | Cod sursa (job #2586229) | Cod sursa (job #2815918)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("a.in");
ofstream fout("a.out");
char s[100005];
int semn(int st, int dr, char semn1, char semn2) {
int p=0;
for (int i=dr; i>=st; i--)
if (s[i]==')')
p--;
else if (s[i]=='(')
p++;
else if ((s[i]==semn1 || s[i]==semn2) && p==0)
return i;
return -1;
}
int verifparanteze(int st, int dr) {
int p=0;
for (int i=st; i<=dr; i++) {
if (s[i]==')')
p--;
else if (s[i]=='(')
p++;
if (p<0)
return 0;
}
return p==0;
}
int formarenumar(int st, int dr) {
int nr=0;
for (int i=st; i<=dr; i++)
nr=nr*10+(s[i]-'0');
return nr;
}
int eval(int st, int dr) {
if (s[st]=='(' && s[dr]==')')
if (verifparanteze(st+1, dr-1))
return eval(st+1, dr-1);
int p=semn(st, dr, '+', '-');
if (p==-1)
p=semn(st, dr, '*', '/');
if (p==-1)
return formarenumar(st, dr);
switch (s[p]) {
case '+':
return eval(st, p-1)+eval(p+1, dr);
case '-':
return eval(st, p-1)-eval(p+1, dr);
case '/':
return eval(st, p-1)/eval(p+1, dr);
case '*':
return eval(st, p-1)*eval(p+1, dr);
}
}
int main() {
fin>>s;
fout<<eval(0, strlen(s)-1);
return 0;
}