Pagini recente » Cod sursa (job #2811971) | Cod sursa (job #1843634) | Cod sursa (job #2206578) | Cod sursa (job #1314619) | Cod sursa (job #2456632)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
queue <int> numere;
stack <char> semne;
stack <int> calcul;
const int numax=1000000005;
bool comparatie(char a,char b)
{
if((b=='*'||b=='/')&&(a=='+'||a=='-'))
return true;
return false;
}
void citire()
{
char x,sem,y,z='(';
fin.get(x);
while(x!='\n')
{
if(!semne.empty())
sem=semne.top();
if(x=='-'&&z=='(')
{
int nr=0;
while(isdigit(x))
{
nr=nr*10+x-'0';
fin.get(x);
}
nr=-1*nr;
numere.push(nr);
}
if(isdigit(x))
{
int nr=0;
while(isdigit(x))
{
nr=nr*10+x-'0';
z=x;
fin.get(x);
}
numere.push(nr);
}
else
{
if(!semne.empty()&&(semne.top()!='('||x==')'))
{
if(x=='(')
{
semne.push(x);
}
else if(comparatie(semne.top(), x))
semne.push(x);
else
{
while(!semne.empty() && semne.top() != '(')
{
switch (semne.top())
{
case '+' : numere.push(numax+1); break;
case '-' : numere.push(numax+2); break;
case '*' : numere.push(numax+3); break;
case '/' : numere.push(numax+4); break;
default : break;
}
semne.pop();
if(!semne.empty())
sem=semne.top();
}
if(!semne.empty())
semne.pop();
if(x!=')')
semne.push(x);
}
} else
semne.push(x);
z=x;
fin.get(x);
}
}
while(!semne.empty()&&semne.top()!='(')
{
switch (semne.top())
{
case '+' : numere.push(numax+1); break;
case '-' : numere.push(numax+2); break;
case '*' : numere.push(numax+3); break;
case '/' : numere.push(numax+4); break;
default : break;
}
semne.pop();
if(!semne.empty())
sem=semne.top();
}
}
int calculare()
{
int x,y,c,nr,m;
while(!numere.empty())
{
nr=numere.front();
if(numere.front()<numax)
{
calcul.push(numere.front());
c=calcul.top();
}
else
{
switch (numere.front())
{
case numax+1: x=calcul.top(); calcul.pop();y=calcul.top();calcul.pop();x=x+y;calcul.push(x);break;
case numax+2: x=calcul.top();
calcul.pop();
y=calcul.top();
calcul.pop();
x=y-x;
calcul.push(x);break;
case numax+3: x=calcul.top(); calcul.pop();y=calcul.top();calcul.pop();x=x*y;calcul.push(x);break;
case numax+4: x=calcul.top(); calcul.pop();y=calcul.top();calcul.pop();x=y/x;calcul.push(x);break;
}
c = calcul.top();
}
numere.pop();
}
return calcul.top();
}
int main()
{
citire();
fout << calculare();
return 0;
}