Pagini recente » Cod sursa (job #1331733) | Cod sursa (job #203633) | Cod sursa (job #1637200) | Cod sursa (job #1080089) | Cod sursa (job #1991186)
#include <fstream>
#include <iostream>
#include <stack>
#include <cstring>
using namespace std;
char c[100001];
struct Node{
union Value {int nr; char op;};
Value value;
Node* left = nullptr;
Node* right = nullptr;
};
Node* arb = nullptr;
void read()
{
ifstream is("evaluare.in", ios::in);
char caracter, urmator;
int i = 0, inParanteza = 0, special = 0;
stack<char> operatori;
caracter = is.get();
do
{
if (isdigit(caracter))
{
c[i++] = caracter;
goto final;
}
if (caracter == '(')
{
++inParanteza;
operatori.push('(');
goto final;
}
if (caracter == ')')
{
--inParanteza;
caracter = operatori.top();
operatori.pop();
do
{
c[i++] = caracter;
caracter = operatori.top();
operatori.pop();
} while (caracter != '(');
if (inParanteza == 0)
while (!operatori.empty())
{
c[i++] = operatori.top();
operatori.pop();
}
goto final;
}
if (i && isdigit(c[i-1]))
c[i++] = ';';
if (caracter == '*' || caracter == '\\')
special = 1;
operatori.push(caracter);
final:
urmator = is.get();
if (special && isdigit(caracter) && !isdigit(urmator))
{
c[i++] = operatori.top();
operatori.pop();
--special;
}
caracter = urmator;
} while (!(caracter == '\n' || caracter == '\0'));
while (!operatori.empty())
{
caracter = operatori.top();
operatori.pop();
c[i++] = caracter;
}
c[i] = '\0';
//cout << c;
}
void create()
{
int n = strlen(c), nr = 0;
stack<Node*> noduri;
for (int i = 0; i < n; ++i)
{
if (isdigit(c[i]))
{
nr = nr * 10 + c[i] - '0';
continue;
}
if (nr)
{
Node* nodV = new Node;
nodV->value.nr = nr;
nr = 0;
noduri.push(nodV);
if (c[i] == ';')
continue;
}
Node* nodO = new Node;
nodO->value.op = c[i];
nodO->right = noduri.top();
noduri.pop();
nodO->left = noduri.top();
noduri.pop();
noduri.push(nodO);
}
arb = noduri.top();
noduri.pop();
}
int calculate(Node* nod)
{
if (nod->left == nullptr)
return nod->value.nr;
switch (nod->value.op)
{
case '+':
return calculate(nod->left) + calculate(nod->right);
case '-':
return calculate(nod->left) - calculate(nod->right);
case '*':
return calculate(nod->left) * calculate(nod->right);
case '/':
return calculate(nod->left) / calculate(nod->right);
default:
return 0;
}
}
int main()
{
read();
create();
ofstream os("evaluare.out", ios::out | ios::trunc);
os << calculate(arb);
os.close();
return 0;
}