Cod sursa(job #2508192)
Utilizator | Data | 11 decembrie 2019 18:41:29 | |
---|---|---|---|
Problema | Evaluarea unei expresii | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 4.98 kb |
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdlib>
#include <stack>
using namespace std;
stack <char> semne;
stack <int> numere;
char s[100050];
int prop(char c)
{///prioritatea operandului
if(c=='(')return 0;
if(c=='+'||c=='-')return 1;
if(c=='*'||c=='/')return 2;
if(c=='~')return 3;
return -1;
}
int main()
{
char ll;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
fin.getline(s+1,100050);///includ manual expresia intre paranteze
s[0]='(';
int n=strlen(s);
s[n]=')';s[++n]=0;
int i=0,j,b,a;
char numars[100];
while(i<n)
{
if(s[i]=='(')
{semne.push(s[i]);i++;}
else
if(s[i]=='-'&&prop(s[i-1])>=0)///verific daca e vorba de un minus unar: asta inseamna ca inainta lui
///este fie paranteza deschisa fie un operand
{i++;semne.push('~');}///bag in stiva ~ ca sa shtiu ca e vorba de minus unar
else
if(s[i]==')')///golesc stiva pina la '('
{
while(semne.top()!='(')
{
if(semne.top()=='~')
{semne.pop();numere.top()*=-1;}
else if(semne.top()=='*')
{
a=numere.top();numere.pop();
b=numere.top();numere.pop();
semne.pop();numere.push(b*a);
}
else if(semne.top()=='/')
{
a=numere.top();numere.pop();
b=numere.top();numere.pop();
semne.pop();numere.push(b/a);
}
else if(semne.top()=='+')
{
a=numere.top();numere.pop();
b=numere.top();numere.pop();
semne.pop();numere.push(b+a);
}
else if(semne.top()=='-')
{
a=numere.top();numere.pop();
b=numere.top();numere.pop();
semne.pop();numere.push(b-a);
}
}
i++;
semne.pop();///golesc shi paranteza deschisa
}
else
if(prop(s[i])>0)///deci e semn: golesc stiva pina la un op. cu prioritate strict
{///mai mica
while(prop(s[i])<=prop(ll=semne.top()))
{
if(semne.top()=='~')
{semne.pop();numere.top()*=-1;}
else if(semne.top()=='*')
{
a=numere.top();numere.pop();
b=numere.top();numere.pop();
semne.pop();numere.push(b*a);
}
else if(semne.top()=='/')
{
a=numere.top();numere.pop();
b=numere.top();numere.pop();
semne.pop();numere.push(b/a);
}
else if(semne.top()=='+')
{
a=numere.top();numere.pop();
b=numere.top();numere.pop();
semne.pop();numere.push(b+a);
}
else if(semne.top()=='-')
{
a=numere.top();numere.pop();
b=numere.top();numere.pop();
semne.pop();numere.push(b-a);
}
}
///shi pun operatorul meu:
semne.push(s[i]);
i++;
}
else///deci e numar: il izolez:
{
j=i;
while(isdigit(s[j]))j++;
strncpy(numars,s+i,j-i);
numars[j-i]=0;
numere.push(atoi(numars));
i=j;
}
}
fout<<numere.top();
return 0;
}