Pagini recente » Cod sursa (job #2749228) | Profil miahi | Cod sursa (job #1552703) | Cod sursa (job #2781995) | Cod sursa (job #2788454)
///rezolvare cu varianta 2
#include <stdio.h>
#include <string.h>
#define MAXCH 100000
char list_sg[MAXCH];
char s[MAXCH];
int list_nr[MAXCH];
int loc, nr_sg, nr_nr;
void addSign(char ch) {
if ( ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')' ){
list_sg[nr_sg] = ch;
nr_sg++;
}
}
char lastSign() {
return list_sg[nr_sg - 1];
}
char popSign() {
nr_sg--;
return list_sg[nr_sg];
}
int lastNumber() {
return list_nr[nr_nr - 1];
}
void addNumber(int n) {
list_nr[nr_nr] = n;
nr_nr++;
}
int popNumber() {
nr_nr--;
return list_nr[nr_nr];
}
int factor() {
int nr;
nr = 0;
while ( s[loc] >= '0' && s[loc] <= '9' ) {
nr = nr * 10 + s[loc] - '0';
loc++;
}
return nr;
}
int priority(char ch) {
if ( ch == '*' || ch == '/' )
return 2;
if ( ch == '+' || ch == '-' )
return 1;
return 0;
}
int operation(int a, int b, char sg) {
if ( sg == '*' )
return a * b;
if ( sg == '/' )
return a / b;
if ( sg == '+' )
return a + b;
return a - b;
}
void simpleOperation() {
addNumber(operation(popNumber(), popNumber(), popSign()));
}
int main() {
FILE *fin, *fout;
int n;
fin = fopen("evaluare.in", "r");
fgets(s, MAXCH, fin);
n = strlen(s);
fclose(fin);
loc = 0;
nr_sg = 0;
nr_nr = 0;
while ( loc < n - 1 ) {
while ( s[loc] == '(' ) {
addSign(s[loc]);
loc++;
}
if ( s[loc] >= '0' && s[loc] <= '9' ){
addNumber(factor());
} else if ( priority(s[loc]) ) {
while ( priority(lastSign()) && priority(s[loc]) <= priority(lastSign()) ) {
simpleOperation();
}
addSign(s[loc]);
loc++;
} else if ( s[loc] == ')' ) {
while ( lastSign() != '(' ) {
simpleOperation();
}
popSign();
loc++;
}
}
while ( nr_sg > 0 ) {
simpleOperation();
}
fout = fopen("evaluare.out", "w");
fprintf(fout, "%d", popNumber());
fclose(fout);
return 0;
}