Pagini recente » Autentificare | Cod sursa (job #2016264) | Cod sursa (job #856989) | Cod sursa (job #1963695) | Cod sursa (job #2049069)
#include <fstream>
#define DEF 100002
using namespace std;
ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");
char c[DEF];
int i, stiva[DEF], k, v[DEF], k2, cod[200];
void paranteza_inchisa () {
while (k) {
if (stiva[k] == '(') {
-- k;
break;
}
v[++ k2] = cod[stiva[k]];
-- k;
}
}
void ad_sc (char x) {
while (stiva[k] == '+' || stiva[k] == '-') {
v[++ k2] = cod[stiva[k]];
-- k;
}
stiva[++ k] = x;
}
void imu_imp (char x) {
while (stiva[k] == '*' || stiva[k] == '/' || stiva[k] == '+' || stiva[k] == '-') {
v[++ k2] = cod[stiva[k]];
-- k;
}
stiva[++ k] = x;
}
void numar () {
int r = 0;
while (c[i] >= '0' && c[i] <= '9') {
r = r * 10 + c[i] - '0';
++ i;
}
-- i;
v[++ k2] = r;
}
int main () {
cod['*'] = DEF + 1; //100003
cod['/'] = DEF + 2; //100004
cod['+'] = DEF + 3; //100005
cod['-'] = DEF + 4; //100006
fin >> c + 1;
for (i = 1; c[i] != 0; i++) {
switch (c[i]) {
case '(' : stiva[++ k] = '(';
break;
case ')' : paranteza_inchisa ();
break;
case '+' : ad_sc ('+');
break;
case '-' : ad_sc ('-');
break;
case '*' : imu_imp ('*');
break;
case '/' : imu_imp ('/');
break;
default : numar ();
}
}
while (k) {
v[++ k2] = cod[stiva[k]];
-- k;
}
for (int i = 1; i <= k2; i++) {
fout << v[i] << " ";
}
fout << "\n";
for (int i = 1; i <= k2; i++) {
if (v[i] < DEF) {
stiva [++ k] = v[i];
continue;
}
if (v[i] == DEF + 1) { // *
stiva[k - 1] *= stiva[k];
-- k;
}
if (v[i] == DEF + 2) { // /
stiva[k - 1] /= stiva[k];
-- k;
}
if (v[i] == DEF + 3) { // +
stiva[k - 1] += stiva[k];
-- k;
}
if (v[i] == DEF + 4) { // -
stiva[k - 1] -= stiva[k];
-- k;
}
}
fout << stiva[1];
return 0;
}