Pagini recente » Cod sursa (job #2027725) | Cod sursa (job #1308564) | Cod sursa (job #2047925) | Cod sursa (job #2333428) | Cod sursa (job #1143140)
#include "ArboreBinar.h"
#include<iostream>
#include<sstream>
#include<stack>
#include<fstream>
using namespace std;
class ArboreBinar
{
char cOperator;
//double dNumber;
long long dNumber;
ArboreBinar *stg, *drp;
bool valid;
ArboreBinar(double);
ArboreBinar(char);
public:
static string InfixPostfix(const string& expresie);
ArboreBinar();
ArboreBinar(string& expresie);
bool EsteValid();
string Parcurgere(int nCodParcurgere);
long long Evalueaza(ArboreBinar*);
};
ArboreBinar::ArboreBinar()
{
cOperator = '\0';
dNumber = 0;
stg = drp = NULL;
valid = false;
}
ArboreBinar::ArboreBinar(double nr)
{
cOperator = '\0';
dNumber = nr;
stg = drp = NULL;
valid = true;
}
ArboreBinar::ArboreBinar(char ch)
{
cOperator = ch;
dNumber = 0;
stg = drp = NULL;
valid = true;
}
ArboreBinar::ArboreBinar(string& expresie)
{
ArboreBinar *nr, *op;
stack<ArboreBinar*>aStack;
string number;
int l = expresie.size(), i=0;
char aChar;
while (i < l)
{
aChar = expresie[i];
switch (aChar)
{
case ' ': aChar=expresie[++i]; break;
case '.':
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
number = "";
do
{
number += aChar;
aChar = expresie[++i];
} while ((isdigit(aChar) || aChar == '.') && i < l - 1);
nr = new ArboreBinar(atof(number.c_str()));
aStack.push(nr); break;
case '-':
case '+':
case '*':
case '/':
op = new ArboreBinar(aChar);
op->drp = aStack.top();
aStack.pop();
op->stg = aStack.top();
aStack.pop();
aStack.push(op);
i++;
break;
}
}
cOperator = aStack.top()->cOperator;
dNumber = aStack.top()->dNumber;
stg = aStack.top()->stg;
drp = aStack.top()->drp;
valid = aStack.top()->valid;
}
string ArboreBinar::InfixPostfix(const string& expresie)
{
stringstream stream;
string number;
stream << expresie;
stack<string> aStack;
string postExpresie;
string sign;
char chSpace = ' ';
while (stream)
{
string strNumar;
string strOperator;
char aChar = stream.peek();
switch (aChar)
{
case ' ': stream.ignore(); continue;
case '.':
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
stream.ignore();
number = "";
do
{
number += aChar;
aChar = stream.peek();
stream.ignore();
} while (isdigit(aChar) || aChar=='.');
stream.putback(aChar);
postExpresie += number;
postExpresie += chSpace; break;
case '+':
case '-':
stream.ignore();
while ((!aStack.empty()) && ((aStack.top() == "*") || (aStack.top() == "/")))
{
postExpresie += aStack.top();
postExpresie += chSpace;
aStack.pop();
}
sign = "";
sign += aChar;
aStack.push(sign); break;
case '*':
case '/':
sign = "";
stream.ignore();
sign += aChar;
aStack.push(sign); break;
break;
case '(':
stream.ignore();
aStack.push("(");
break;
case ')':
stream.ignore();
while ((!aStack.empty()) && (aStack.top() != "("))
{
postExpresie += aStack.top();
postExpresie += chSpace;
aStack.pop();
}
if (!aStack.empty())
aStack.pop();
break;
case EOF: continue;
default:cout << "Eroare la parsarea expresiei!";
break;
}
}
while (!aStack.empty())
{
postExpresie += aStack.top();
postExpresie += chSpace;
aStack.pop();
}
return postExpresie;
}
long long ArboreBinar::Evalueaza(ArboreBinar *A)
{
if (A->stg == NULL && A->drp == NULL)
return A->dNumber;
else
{
switch(A->cOperator)
{
case '+': return Evalueaza(A->stg) + Evalueaza(A->drp); break;
case '-': return Evalueaza(A->stg) - Evalueaza(A->drp); break;
case '*': return Evalueaza(A->stg) * Evalueaza(A->drp); break;
case '/': return Evalueaza(A->stg) / Evalueaza(A->drp); break;
}
}
}
int main()
{
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
string exp;
fin >> exp;
string exp2;
exp2 = ArboreBinar::InfixPostfix(exp);
ArboreBinar *Arb;
Arb = new ArboreBinar(exp2);
long long a=(*Arb).Evalueaza(Arb);
fout << a << '\n';
return 0;
}