Pagini recente » Cod sursa (job #2374096) | Cod sursa (job #2211366) | Cod sursa (job #125184) | Cod sursa (job #1887685) | Cod sursa (job #2986482)
#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;
stack<char>op;
stack<int>num;
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;
}
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.push(nr);
}
else {
//am operator
char oper = expr[i];
if (oper == '(')
{
//adaug in stiva
op.push(oper);
}
else if (oper == ')')
{
//rezolv ec pana cand dau de '('
while (!op.empty() && op.top()!='(')
{
char ex = op.top();
int nrTop = num.top();
num.pop();
int rez = calc(num.top(), nrTop, ex);
num.pop();
num.push(rez);
op.pop();
}
op.pop();
}
else {
while (!op.empty() && prior(oper) <= prior(op.top()))
{
char ex = op.top();
int nrTop = num.top();
num.pop();
int rez = calc(num.top(), nrTop, ex);
num.pop();
num.push(rez);
op.pop();
}
op.push(oper);
}
}
}
while (!op.empty())
{
char ex = op.top();
int nrTop = num.top();
num.pop();
int rez = calc(num.top(), nrTop, ex);
num.pop();
num.push(rez);
op.pop();
}
fprintf(fout,"%d", num.top());
return 0;
}