Pagini recente » Cod sursa (job #362387) | Cod sursa (job #1369398) | Statistici Sincai Iulia (iulia_sincai) | Cod sursa (job #684444) | Cod sursa (job #2986489)
#include <cstdio>
#include <cmath>
#include <climits>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <bitset>
#include <unordered_map>
#include <cstring>
#include <algorithm>
#define NMAX 100003
using namespace std;
FILE* fin, * fout;
int nivOp, nivNum;
char op[NMAX];
int num[NMAX];
char expr[NMAX];
int prior(char ch)
{
if (ch == '*' || ch == '/')
{
return 2;
}
if (ch == '(')
{
return 0;
}
return 1;
}
int calc(long long a, long long b, char ch)
{
if (ch == '+')
{
return a + b;
}
if (ch == '-')
{
return a - b;
}
if (ch == '*')
{
return a * b;
}
if (ch == '/')
{
return a / b;
}
}
int main()
{
fin = fopen("evaluare.in", "r");
fout = fopen("evaluare.out", "w");
fgets(expr,NMAX,fin);
int n = strlen(expr);
for (int i = 0; i < n; i++)
{
if (expr[i] >= '0' && expr[i] <= '9')
{
//e numar
int nr = 0;
while (i < n && expr[i] >= '0' && expr[i] <= '9')
{
nr = nr * 10 + expr[i] - '0';
i++;
}
if (i < n)
{
i--;
}
num[++nivNum]=nr;
}
else {
//am operator
char oper = expr[i];
if (oper == '(')
{
//adaug in stiva
op[++nivOp]=oper;
}
else if (oper == ')')
{
//rezolv ec pana cand dau de '('
while (nivOp>0 && op[nivOp]!='(')
{
char ex = op[nivOp];
int nrTop = num[nivNum--];
int rez = calc(num[nivNum], nrTop, ex);
num[nivNum]=rez;
nivOp--;
}
nivOp--;
}
else {
while (nivOp > 0 && prior(oper) <= prior(op[nivOp]))
{
char ex = op[nivOp];
int nrTop = num[nivNum--];
int rez = calc(num[nivNum], nrTop, ex);
num[nivNum] = rez;
nivOp--;
}
op[++nivOp]=oper;
}
}
}
while (nivOp > 0)
{
char ex = op[nivOp];
int nrTop = num[nivNum--];
int rez = calc(num[nivNum], nrTop, ex);
num[nivNum] = rez;
nivOp--;
}
fprintf(fout,"%d", num[1]);
return 0;
}