Pagini recente » Cod sursa (job #2832282) | Cod sursa (job #2963734) | Cod sursa (job #3280762) | Cod sursa (job #2591121) | Cod sursa (job #1814204)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in ("evaluare.in");
ofstream out ("evaluare.out");
int const NMAX = 100000;
int numstack[NMAX];
int opstack[NMAX];
int oppointer = 0 ,numpointer = 0;
///functie de calcul pentru operatori + ,- ,* ,/
void sum(int nr){
if(nr == 2)
numstack[numpointer - 2] = numstack[numpointer - 2] - numstack[numpointer - 1];
if(nr == 3)
numstack[numpointer - 2] = numstack[numpointer - 2] + numstack[numpointer - 1];
if(nr == 4)
numstack[numpointer - 2] = numstack[numpointer - 2] * numstack[numpointer - 1];
if(nr == 5)
numstack[numpointer - 2] = numstack[numpointer - 2] / numstack[numpointer - 1];
}
void procesnumber(int nr){
numstack[numpointer] = nr;
numpointer++;
}
void procesoperator(int op){
/// daca 1.stiva e goala sau 2. operatorul e paranteza deschisa
/// 3.operatorul are prioritate mai mare decat cea a opertorului precedent e pus in stiva
if(oppointer == 0 || op == 0 || opstack[oppointer - 1] / 2 < op / 2){
opstack[oppointer] = op;
oppointer++;
} else if(op == 1){
while(opstack[oppointer - 1] != 0){
sum(opstack[oppointer - 1]);
numpointer--;
oppointer--;
}
oppointer--;
} else {
sum(opstack[oppointer - 1]);
numpointer--;
opstack[oppointer-1] = op;
}
}
void reducestaks(){
while(oppointer > 0){
sum(opstack[oppointer - 1]);
numpointer--;
oppointer--;
}
}
int main(){
int nr = 0;
char c = 0;
bool ok = 0;
while(in>>c){
if(c >= '0' && c <= '9'){
nr = nr * 10 + (c - '0');
ok = 1;
}
else{
if(ok){
procesnumber(nr);
}
ok = 0;
nr = 0;
///catul impartiri la 2 e prioritatea
if(c == '-')
procesoperator(2);
else if(c == '+')
procesoperator(3);
else if(c == '*')
procesoperator(4);
else if(c == '/')
procesoperator(5);
else if(c == '(')
procesoperator(0);
else if(c == ')')
procesoperator(1);
}
}
if(ok)
procesnumber(nr);
if(oppointer > 0){
reducestaks();
}
out<<numstack[numpointer-1];
return 0;
}