Pagini recente » Cod sursa (job #1538639) | Cod sursa (job #2180603) | Cod sursa (job #2301836) | Cod sursa (job #1040885) | Cod sursa (job #2531989)
#include <bits/stdc++.h>
#define N_MAX 100005
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
struct node
{
string info;
node *le, *ri;
};
node *root = NULL;
string E;
string atomi[N_MAX];
int n, idx = 1;
void Atomizare()
{
for (int i = 0; E[i]; i++)
{
int j = i;
while ('0' <= E[j] && E[j] <= '9')
j++;
atomi[++n] = E.substr(i, j - i + (i == j));
i = j - (i != j);
}
}
node *Factor();
node *Termen();
node *Expresie();
node *Factor()
{
if (atomi[idx] == "(")
{
idx++;
node *p = Expresie();
idx++;
return p;
}
else
return new node{atomi[idx++], NULL, NULL};
}
node *Termen()
{
node *newNode = new node;
newNode = Factor();
if (atomi[idx] == "*" || atomi[idx] == "/")
return new node{atomi[idx++], newNode, Termen()};
else return newNode;
}
node *Expresie()
{
node *newNode = new node;
if (atomi[idx] == "+")
{
idx++;
newNode = Termen();
}
else if (atomi[idx] == "-")
{
idx++;
newNode = Termen();
newNode->info = '-' + newNode->info;
}
else
newNode = Termen();
if (atomi[idx] == "+" || atomi[idx] == "-")
{
node *aux = new node{atomi[idx++], newNode, Expresie()};
return aux;
}
return newNode;
}
int Convert(string s)
{
int ret = 0;
if (s[0] == '+')
return Convert(s.substr(1));
else if (s[0] == '-')
return -Convert(s.substr(1));
for (int i = 0; i < s.size(); i++)
ret = ret * 10 + s[i] - '0';
return ret;
}
int Evaluare(node *currNode)
{
if (currNode->info == "+")
return Evaluare(currNode->le) + Evaluare(currNode->ri);
else if (currNode->info == "-")
return Evaluare(currNode->le) - Evaluare(currNode->ri);
else if (currNode->info == "*")
return Evaluare(currNode->le) * Evaluare(currNode->ri);
else if (currNode->info == "/")
return Evaluare(currNode->le) / Evaluare(currNode->ri);
else
return Convert(currNode->info);
}
int main()
{
fin >> E;
E = '(' + E + ')';
Atomizare();
root = Factor();
fout << Evaluare(root);
return 0;
}