Pagini recente » Cod sursa (job #2831296) | Cod sursa (job #2135803) | Cod sursa (job #3241769) | Cod sursa (job #2522749) | Cod sursa (job #569219)
Cod sursa(job #569219)
#include <iostream>
#include <fstream>
#include <stack>
using namespace std;
#define MAXN 100010
#define isDigit(d) ('0' <= (d) && (d) <= '9')
char buf[MAXN];
int prior [] = {0};
stack <pair<int, int> > expr, op;
void push_operator (int o)
{
int a = expr.top ().second; expr.pop ();
int b = expr.top ().second; expr.pop ();
int c = 0;
switch (o) {
case 5:
c = a + b;break;
case 4:
c = b - a;break;
case 3:
c = a * b;break;
case 2:
c = b / a;break;
}
expr.push (make_pair (0, c));
}
void push_stack (pair<int, int> p)
{
if (p.first == 0) {
expr.push (p);
} else if (p.first == 1) {
while (!op.empty () && op.top ().first != 6) {
push_operator (op.top ().first);
op.pop ();
}
op.pop ();
} else {
while (!op.empty () && op.top ().second >= p.second && op.top ().first != 6) {
push_operator (op.top ().first);
op.pop ();
}
op.push (p);
}
}
int main ()
{
FILE* fin = fopen ("evaluare.in", "r");
FILE* fout = fopen ("evaluare.out", "w");
fgets (buf, MAXN, fin);
char *ptr = buf;
int num = 0;
while (*ptr != '\n' && *ptr != ' ' && *ptr != '\0') {
switch (*ptr) {
case '(':
push_stack (make_pair (6, 3));
break;
case '+':
push_stack (make_pair (5, 1));
break;
case '-':
push_stack (make_pair (4, 1));
break;
case '*':
push_stack (make_pair (3, 2));
break;
case '/':
push_stack (make_pair (2, 2));
break;
case ')':
push_stack (make_pair (1, 3));
break;
default:
num = 0;
while (isDigit (*ptr)) {
num = num * 10 + *ptr - '0';
++ptr;
}
--ptr;
push_stack (make_pair (0, num));
break;
}
++ptr;
}
while (!op.empty ()) {
push_operator(op.top ().first);
op.pop ();
}
fprintf (fout, "%d\n", expr.top ().second);
fclose (fin);
fclose (fout);
return 0;
}