Cod sursa(job #3137084)
Utilizator | Data | 11 iunie 2023 11:10:51 | |
---|---|---|---|
Problema | Evaluarea unei expresii | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.81 kb |
#include <fstream>
using namespace std;
ifstream fin ("evaluare.in");
ofstream fout("evaluare.out");
char expr[100002];
int op[100001],k1,k2;
char semn[100001],pr[256];
int calcul(char op,int x,int y)
{
switch(op){
case '+':
return x+y;
case '-':
return x-y;
case '*':
return x*y;
case '/':
return x/y;
}
}
int main()
{
fin>>expr;
pr['+']=pr['-']=1;
pr['*']=pr['/']=2;
for(int i=0;expr[i]!=0;i++)
{
if(expr[i]==('('))
semn[++k1]=expr[i];
else
if(expr[i]>='0' && expr[i]<='9')
{
int nr=0;
while(expr[i]>='0' && expr[i]<='9')
{
nr=nr*10+expr[i]-'0';
i++;
}
op[++k2]=nr;
i--;
}
else
if(expr[i]==')')
{
while(semn[k1]!='(')
{
int rez=calcul(semn[k1],op[k2-1],op[k2]);
k1--;
k2--;
op[k2]=rez;
}
k1--;
}
else
{
while(k1>0&&pr[expr[i]]<=pr[semn[k1]])
{
int rez=calcul(semn[k1],op[k2-1],op[k2]);
k1--;
k2--;
op[k2]=rez;
}
semn[++k1]=expr[i];
}
}
while(k1>0)
{
int rez=calcul(semn[k1],op[k2-1],op[k2]);
k1--;
k2--;
op[k2]=rez;
}
fout<<op[1];
return 0;
}