Cod sursa(job #2264496)
Utilizator | Data | 20 octombrie 2018 10:02:44 | |
---|---|---|---|
Problema | Evaluarea unei expresii | Scor | 0 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 3.49 kb |
#include <iostream>
#include <fstream>
#include <cctype>
#include <cstring>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
const int NMAX=100001;
int pr(char c)
{
switch(c)
{
case '+':
return 1;
case '-':
return 1;
case '*':
return 2;
case '/':
return 3;
default :
return 0;
}
}
int main()
{
char op[NMAX/2+5],c;
long int val[NMAX/2+5],top=0,top1=0,nr=0,n;
char s[NMAX+5];
f.getline(s,NMAX+5);
n=strlen(s);
int i=0;
while(i<n)
{
if(isdigit(s[i]))
{
while(isdigit(s[i]) && i<n)
{
nr=nr*10+(s[i]-'0');
i++;
}
val[++top1]=nr;
nr=0;
i--;
}
else
{
if(s[i]==')')
{
while(op[top]!='(' && top>0)
{
switch(op[top])
{
case '+':
{
val[top1-1]+=val[top1];
break;
}
case '-':
{
val[top1-1]-=val[top1];
break;
}
case '*' :
{
val[top1-1]*=val[top1];
break;
}
case '/':
{
val[top1-1]/=val[top1];
break;
}
}
top--;
top1--;
}
top--;
}
else if((pr(s[i])>pr(op[top])) || top==0 || op[top]=='(')
op[++top]=s[i];
else
{
while(top>0 && pr(s[i])<=op[top])
{
switch(op[top])
{
case '+':
{
val[top1-1]+=val[top1];
break;
}
case '-':
{
val[top1-1]-=val[top1];
break;
}
case '*' :
{
val[top1-1]*=val[top1];
break;
}
case '/':
{
val[top1-1]/=val[top1];
break;
}
}
top1--;
top--;
}
op[++top]=s[i];
}
}
i++;
}
if(i==n)
{
while(top>0)
{
switch(op[top])
{
case '+':
{
val[top1-1]+=val[top1];
break;
}
case '-':
{
val[top1-1]-=val[top1];
break;
}
case '*' :
{
val[top1-1]*=val[top1];
break;
}
case '/':
{
val[top1-1]/=val[top1];
break;
}
}
top1--;
top--;
}
}
g<<val[top1];
return 0;
}