Pagini recente » Cod sursa (job #3209761) | Cod sursa (job #884813) | Cod sursa (job #2605720) | Cod sursa (job #28910) | Cod sursa (job #354707)
Cod sursa(job #354707)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
#define pb push_back
#define MAXN 100005
vector<int> STN;
vector<char> STS;
char buf[MAXN];
int cur=0;
int simply(int a, int b, char sig)
{
switch(sig)
{
case '+':
return a+b;
case '-':
return a-b;
case '*':
return a*b;
case '/':
return a/b;
}
}
bool isSign(char c)
{
if ((c == '+')||(c == '-')||(c == '*')||(c == '/'))
return true;
return false;
}
int getNumber()
{
int t=0;
while (buf[cur] >= '0' && buf[cur] <= '9' && cur<strlen(buf))
t= t*10 + buf[cur++]-'0';
return t;
}
int eval()
{
char sig;
int t1,t2;
for (;cur < strlen(buf);)
{
if (buf[cur] == '(')
{
STS.pb('('), cur++;
//printf("paranteza deschis\n");
continue;
}
if (buf[cur] == ')')
{
while (STS.back() != '(')
{
sig = STS.back();
STS.pop_back();
t1 = STN.back();
STN.pop_back();
t2 = STN.back();
STN.pop_back();
STN.push_back(simply(t2,t1,sig));
}
cur++;
//printf("paranteza inchis\n");
continue;
}
if (isSign(buf[cur]))
{
STS.pb(buf[cur]), cur++;
//printf("semn\n");
continue;
}
t1 = getNumber();
//printf("numar: %d CUR:%d \n",t1,cur);
if ( STS.size() > 0 && ((STS.back() == '*') || (STS.back() == '/')) )
{
sig = STS.back();
STS.pop_back();
t2 = STN.back();
STN.pop_back();
STN.pb(simply(t2,t1,sig));
}
else
STN.pb(t1);
}
while (STN.size() > 1)
{
sig = STS.back();
STS.pop_back();
t1 = STN.back();
STN.pop_back();
t2 = STN.back();
STN.pop_back();
STN.push_back(simply(t2,t1,sig));
}
return STN.back();
}
int main ()
{
int i,j,k;
freopen("evaluare.in","rt",stdin);
freopen("evaluare.out","wt",stdout);
fgets(buf,MAXN,stdin);
buf[strlen(buf)-1] = '\0';
printf("%d\n",eval());
return 0;
}