Pagini recente » Cod sursa (job #1674413) | Cod sursa (job #279731) | Cod sursa (job #3261546) | Cod sursa (job #42762) | Cod sursa (job #2713859)
#include <fstream>
#include <stack>
#include <cstring>
using namespace std;
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
#define DIM 100005
char s[DIM];
int fp[DIM], i, nr, lg, q, prioritate[1000], val[1000], a, b;
stack <char> st;
stack <int> rez;
static inline bool opr(char ch) { //daca e operator
return (ch == '+' || ch == '-' || ch == '*' || ch == '/');
}
static inline void atribuire(int &a, int &b) { //retin ultimele 2 elemente din stiva
a = rez.top();
rez.pop();
b = rez.top();
rez.pop();
}
int main() {
cin.getline(s, DIM - 2);
lg = strlen(s);
prioritate['*'] = prioritate['/'] = 2;
prioritate['+'] = prioritate['-'] = 1;
val['+'] = -1;
val['-'] = -2;
val['*'] = -3;
val['/'] = -4;
st.push('('); //santinela
s[lg] = ')'; //pentru a goli stiva
nr = -1;
for(i = 0; i <= lg; i++) {
if(isdigit(s[i])) {
if(nr == -1)
nr = 0; //daca nr era resetat
nr = nr * 10 + s[i] - '0';
}else if(nr != -1) { //daca avem ce adauga
fp[++q] = nr;
nr = -1; //resetam nr
}
if(s[i] == '(')
st.push('(');
if(opr(s[i])) {
while(prioritate[st.top()] >= prioritate[s[i]]) { //eliminam semnele cu prioritate mai mare sau egala
fp[++q] = val[st.top()];
st.pop();
}
st.push(s[i]); //adaug semnul actual
}
if(s[i] == ')') {
while(st.top() != '(') { //inchid paranteza
fp[++q] = val[st.top()];
st.pop();
}
st.pop();
}
}
for(i = 1; i <= q; i++)
if(fp[i] == -1) { //daca semnul e +
atribuire(a, b);
rez.push(a + b);
}else if(fp[i] == -2) { //daca semnul e -
atribuire(a, b); //scad pe a din b;
rez.push(b - a);
}else if(fp[i] == -3) { //daca semnul e *
atribuire(a, b);
rez.push(a * b);
}else if(fp[i] == -4) { //daca semnul e /;
atribuire(a, b); //impart b la a;
rez.push(b / a);
}else rez.push(fp[i]);
cout << rez.top();
return 0;
}