Pagini recente » Cod sursa (job #385291) | Cod sursa (job #918910) | Cod sursa (job #545771) | Cod sursa (job #123000) | Cod sursa (job #2264287)
#include <iostream>
#include <fstream>
#include <cctype>
#include <cstring>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
const int NMAX=100001;
int pr(char c) {
switch(c) {
case '+':
return 1;
case '-':
return 1;
case '*':
return 2;
case '/':
return 3;
}
}
int main() {
char op[NMAX/2+5],c;
long int val[NMAX/2+5],top=0,top1=0,nr=0,n;
char s[NMAX+5];
f.getline(s,NMAX+5);
n=strlen(s);
int i=0;
while(i<n) {
if(isdigit(s[i])) {
while(isdigit(s[i]) && i<n) {
nr=nr*10+(s[i]-'0');
i++;
}
val[++top1]=nr;
nr=0;
i--;
} else {
if(s[i]==')') {
while(op[top]!='(' && top>0) {
switch(op[top]) {
case '+': {
val[top1-1]=val[top1]+val[top1-1];
top1--;
break;
}
case '-': {
val[top1-1]=val[top1-1]-val[top1];
top1--;
break;
}
case '*' : {
val[top1-1]=val[top1]*val[top1-1];
top1--;
break;
}
case '/': {
val[top1-1]=val[top1-1]/val[top1];
top1--;
break;
}
}
op[top--]=NULL;
}
op[top--]=NULL;
} else if((pr(s[i])>pr(op[top])) || top==0 || op[top]=='(')
op[++top]=s[i];
else {
while(top>0 && pr(s[i])<=op[top]) {
switch(op[top]) {
case '+': {
val[top1-1]=val[top1-1]+val[top1];
top1--;
break;
}
case '-': {
val[top1-1]=val[top1-1]-val[top1];
top1--;
break;
}
case '*' : {
val[top1-1]=val[top1-1]*val[top1];
top1--;
break;
}
case '/': {
val[top1-1]=val[top1-1]/val[top1];
top1--;
break;
}
}
op[top--]=NULL;
}
}
g<<val[top1];
return 0;
}