Pagini recente » Cod sursa (job #2560082) | Cod sursa (job #1826364) | Cod sursa (job #311654) | Cod sursa (job #3181050) | Cod sursa (job #3233036)
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <stack>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
class PrecedentaOperator
{
public:
static int precedenta(char op)
{
if(op=='+' || op=='-')
return 1;
if(op=='*' || op=='/')
return 2;
else
return 0;
}
};
class Operatie
{
public:
static int operatii(int n,int m, char c)
{
if(c=='+')
return n+m;
if(c=='-')
return n-m;
if(c=='*')
return n*m;
if(c=='/')
return n/m;
}
};
class Evaluari
{
public:
static int evaluare(string expresie)
{
int i;
stack<int>valoare;
stack<char>operanzi;
int x=expresie.length();
for(i=0;i<x;i++)
{
if(expresie[i]==' ')
continue;
if(expresie[i]=='(')
{
operanzi.push(expresie[i]);
}
else
if(isdigit(expresie[i]))
{
int val=0;
while(i<x&& isdigit(expresie[i]))
{
val=(val*10)+(expresie[i]-'0');
i++;
}
valoare.push(val);
i--;
}
else
if(expresie[i]==')')
{
while(!operanzi.empty() && operanzi.top()!='(')
{
int val2=valoare.top();
valoare.pop();
int val1=valoare.top();
valoare.pop();
char op=operanzi.top();
operanzi.pop();
valoare.push(Operatie::operatii(val1,val2,op));
}
if(!operanzi.empty())
operanzi.pop();
}
else
{
while(!operanzi.empty() && PrecedentaOperator::precedenta(operanzi.top())>=PrecedentaOperator::precedenta(expresie[i]))
{
int val2=valoare.top();
valoare.pop();
int val1=valoare.top();
valoare.pop();
char op=operanzi.top();
operanzi.pop();
valoare.push(Operatie::operatii(val1,val2,op));
}
operanzi.push(expresie[i]);
}
}
while(!operanzi.empty())
{
int val2=valoare.top();
valoare.pop();
int val1=valoare.top();
valoare.pop();
char op=operanzi.top();
operanzi.pop();
valoare.push(Operatie::operatii(val1,val2,op));
}
return valoare.top();
}
};
class CitireAfis
{
public:
static string citire()
{
string sir;
getline(fin,sir);
return sir;
}
static void afisare(string sir)
{
fout<<Evaluari::evaluare(sir);
}
};
int main()
{
CitireAfis::afisare(CitireAfis::citire());
return 0;
}