Pagini recente » Cod sursa (job #1562135) | Cod sursa (job #966817) | Cod sursa (job #2677416) | Cod sursa (job #2465395) | Cod sursa (job #2788507)
#define N 100000
#include <stdio.h>
#include <cstring>
using namespace std;
char s[N + 5] ;
int i ;
char operators[N + 5] ;
int operatorsize ;
int factors[N + 5] ;
int factorsize ;
//operatori
short prioritate (char operatorr)
{
if(operatorr == '*' or operatorr == '/')
return 1 ;
if(operatorr == '+' or operatorr == '-')
return 2 ;
return 0 ;
}
void adaugare (char character)
{
if(character == '*' or character == '/' or character == '+' or character == '-')
operators[operatorsize++] = character ;
}
char stergere ()
{
if(operatorsize > 0)
return operators[--operatorsize] ;
return '\0' ;
}
char first ()
{
if(operatorsize > 0)
return operators[--operatorsize] ;
return '\0' ;
}
bool ifempty()
{
if(operatorsize > 0)
return true ;
return false ;
}
//factori
int factor()
{
int rez = 0 ;
while (s[i] >= '0' and s[i] <= '9')
{
rez = rez * 10 + (s[i] - '0') ;
i++;
}
return rez ;
}
void adaugare2 (int factor)
{
factors[factorsize++] = factor ;
}
int stergere2 ()
{
if(factorsize > 0)
return factors[--factorsize] ;
return '\0' ;
}
//calcul efectiv
int relatie(int a, int b, char operatorr)
{
int c = 0 ;
if (operatorr == '*')
c = a * b ;
else if (operatorr == '/')
c = a / b;
else if (operatorr == '+')
c = a + b;
else if (operatorr == '-')
c = a - b;
return c ;
}
void stergere_relatie()
{
int a, b ;
a = stergere2() ;
b = stergere2() ;
adaugare(relatie(a, b, stergere())) ;
}
int main()
{
FILE *fin, *fout ;
fin = fopen("evaluare.in", "r") ;
fout = fopen("evaluare.out", "w") ;
fgets(s, N + 5, fin) ;
int length = strlen(s) ;
i = 0 ;
while(i < length)
{
if(s[i] >= '0' and s[i] <= '9')
adaugare2(factor()) ;
else if(s[i] == '(')
adaugare(s[i++]) ;
else if(s[i] == ')')
{
while(first() != '(')
stergere_relatie() ;
stergere() ;
i++;
}
else if(prioritate(s[i]) > 0)
{
while(prioritate(first()) > 0 and prioritate(first()) >= prioritate(s[i]))
stergere_relatie() ;
adaugare(s[i++]) ;
}
else i++;
}
while(ifempty())
stergere_relatie() ;
fprintf(fout, "%d", stergere2()) ;
fclose(fin) ;
fclose(fout) ;
return 0;
}