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