Pagini recente » Cod sursa (job #2854763) | Cod sursa (job #1154412) | Cod sursa (job #2517045) | Cod sursa (job #848377) | Cod sursa (job #2790686)
#include <stdio.h>
#include <string.h>
#define MAXX 100000
using namespace std;
char v[MAXX];
int cnt, n, sign = 1, sum;
char op [MAXX];
int cntOp;
int f [MAXX], cntF;
int hasPriority (char c){
if (c == '*' || c == '/')
return 2;
if (c == '+' || c == '-')
return 1;
return 0;
}
void pushOp(char c) {
op [cntOp ++] = c;
}
int PopOp (){
cntOp --;
return op[cntOp];
}
void PushFact (int fact){
f [cntF] = fact;
cntF ++;
}
int PopFact (){
cntF --;
return f [cntF];
}
int calculate(int x, int y, char c){
if (c == '*')
return x * y;
else if (c == '/')
return x / y;
else if (c == '+')
return x + y;
else if (c == '-')
return x - y;
}
void calcLast (){
int x = PopFact ();
int y = PopFact ();
PushFact(calculate (y, x, op[cntOp - 1]));
cntOp --;
}
int getNumber(){
int number = 0;
while (v[cnt] >= '0' && v[cnt] <= '9'){
number = number * 10 + v [cnt] - '0';
cnt ++;
}
return number;
}
int main()
{
FILE *fin, *fout;
fin = fopen ("evaluare.in", "r");
fout = fopen ("evaluare.out", "w");
fgets (v, MAXX, fin);
n = strlen (v);
while (cnt < n){
if (v [cnt] >= '0' && v [cnt] <= '9')
PushFact (getNumber());
else if (v[cnt] == '('){
pushOp (v[cnt]);
cnt ++;
}
else if (v[cnt] == ')'){
while (op[cntOp - 1] != '('){
calcLast ();
}
cntOp --;
cnt ++;
}
else if (hasPriority (v [cnt])){
while (hasPriority(op[cntOp - 1]) && hasPriority(op[cntOp - 1]) >= hasPriority(v[cnt]))
calcLast ();
pushOp (v[cnt ++]);
}
else
cnt ++;
}
while (cntOp){
calcLast ();
}
fprintf (fout, "%d", PopFact());
return 0;
}
// push, pop, calculate
//plang