Pagini recente » Cod sursa (job #771074) | Cod sursa (job #1392450) | Cod sursa (job #1922438) | Cod sursa (job #1654183) | Cod sursa (job #2788164)
#include <fstream>
#include <assert.h>
using namespace std;
ifstream cin ( "evaluare.in" );
ofstream cout ( "evaluare.out" );
#define NMAX 100000
string s;
int poz_s;
int stiva_numere[NMAX];
int top_stiva_numere;
char stiva_operatori[NMAX];
int top_stiva_operatori;
int factor() {
int ans;
ans = 0;
while ( s[poz_s] >= '0' && s[poz_s] <= '9' ) {
ans = ans * 10 + ( s[poz_s] - '0' );
poz_s++;
}
return ans;
}
void push_Operator() {
if ( s[poz_s] == '+' || s[poz_s] == '-' || s[poz_s] == '*' || s[poz_s] == '/' || s[poz_s] == '(' || s[poz_s] == ')' ) {
stiva_operatori[top_stiva_operatori++] = s[poz_s];
poz_s++;
}
}
void push_Number(int a) {
stiva_numere[top_stiva_numere++] = a;
}
void pop_Operator() {
if ( top_stiva_operatori > 0 )
top_stiva_operatori--;
}
void pop_Number() {
if ( top_stiva_numere > 0 )
top_stiva_numere--;
}
char top_Operator() {
if ( top_stiva_operatori > 0 )
return stiva_operatori[top_stiva_operatori - 1];
return 0;
}
int top_Number( char last_op ) {
if ( top_stiva_numere > 0 )
return stiva_numere[top_stiva_numere - 1];
if ( last_op == '+' || last_op == '-' )
return 0;
return 1;
}
int priority( char op ) {
if ( op == '*' || op == '/' )
return 2;
if ( op == '+' || op == '-' )
return 1;
return 0;
}
int compute( int a, int b, char op ) {
if ( op == '+' )
return a + b;
else if ( op == '*' )
return a * b;
else if ( op == '-' )
return a - b;
else if ( op == '/' )
return a / b;
}
void Last_Compute() {
int a, b;
char op;
op = top_Operator();
pop_Operator();
b = top_Number(op);
pop_Number();
a = top_Number(op);
pop_Number();
push_Number(compute( a, b, op ));
}
int main() {
cin >> s;
poz_s = 0;
while ( poz_s < s.size() ) {
if ( isdigit(s[poz_s]) ) {
push_Number(factor());
} else if ( s[poz_s] == '(' ) {
push_Operator();
push_Operator();
} else if ( s[poz_s] == ')' ) {
while ( top_Operator() != 0 && top_Operator() != '(' ) {
Last_Compute();
}
poz_s++;
pop_Operator();
} else if ( priority(s[poz_s]) ) {
while ( priority(top_Operator()) >= priority(s[poz_s]) ) {
Last_Compute();
}
push_Operator();
}
}
while ( top_stiva_operatori > 0 ) {
Last_Compute();
}
cout << top_Number('\0');
return 0;
}