Pagini recente » Cod sursa (job #1606525) | Cod sursa (job #1884848) | Cod sursa (job #906876) | Cod sursa (job #1031946) | Cod sursa (job #2852568)
#include <fstream>
#include <string>
#include <stack>
using namespace std;
ifstream file_in("evaluare.in");
ofstream file_out("evaluare.out");
int i;
string Expresie;
int Operatie(int Termen_1, int Termen_2, char Operator)
{
switch (Operator)
{
case '+': return Termen_1 + Termen_2;
case '-': return Termen_1 - Termen_2;
case '*': return Termen_1 * Termen_2;
case '/': return Termen_1 / Termen_2;
default: return 0;
}
}
int Prioritate(char Operator)
{
if (Operator == '+' || Operator == '-') return 1;
if (Operator == '*' || Operator == '/') return 2;
return 0;
}
int EvaluareExpresie(string Expresie)
{
stack<int> Operanzi;
stack<char> Operatori;
size_t Lungime = Expresie.length();
int Termen_1, Termen_2, Valoare;
char Operator;
for (i = 0; i < Lungime; ++i)
{
if (Expresie[i] == '(') Operatori.push(Expresie[i]);
else if (Expresie[i] == ')')
{
while (!Operatori.empty() && Operatori.top() != '(')
{
Termen_2 = Operanzi.top();
Operanzi.pop();
Termen_1 = Operanzi.top();
Operanzi.pop();
Operator = Operatori.top();
Operatori.pop();
Operanzi.push(Operatie(Termen_1, Termen_2, Operator));
}
Operatori.pop();
}
else if (isdigit(Expresie[i]))
{
Valoare = 0;
while (i < Lungime && isdigit(Expresie[i]))
Valoare = Valoare * 10 + (Expresie[i] - '0'), ++i;
Operanzi.push(Valoare);
--i;
}
else
{
while (!Operatori.empty() && Prioritate(Operatori.top()) >= Prioritate(Expresie[i]))
{
Termen_2 = Operanzi.top();
Operanzi.pop();
Termen_1 = Operanzi.top();
Operanzi.pop();
Operator = Operatori.top();
Operatori.pop();
Operanzi.push(Operatie(Termen_1, Termen_2, Operator));
}
Operatori.push(Expresie[i]);
}
}
while (!Operatori.empty())
{
Termen_2 = Operanzi.top();
Operanzi.pop();
Termen_1 = Operanzi.top();
Operanzi.pop();
Operator = Operatori.top();
Operatori.pop();
Operanzi.push(Operatie(Termen_1, Termen_2, Operator));
}
return Operanzi.top();
}
int main()
{
file_in >> Expresie;
file_out << EvaluareExpresie(Expresie);
return 0;
}