Pagini recente » Cod sursa (job #351231) | Cod sursa (job #610375) | Cod sursa (job #1185706) | Cod sursa (job #738368) | Cod sursa (job #2713852)
#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];
stack <char> st;
stack <int> rez;
static inline bool opr(char ch) { //daca e operator
return (ch == '+' || ch == '-' || ch == '*' || ch == '/');
}
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) {
int sum = rez.top(); //adunarea si inmultirea sunt comutative
rez.pop();
sum += rez.top();
rez.pop();
rez.push(sum);
}else if(fp[i] == -2) {
int dif = -1 * rez.top(); //trebuie sa l scad pe cel de jos cu cel actual
rez.pop();
dif += rez.top();
rez.pop();
rez.push(dif);
}else if(fp[i] == -3) {
int prod = rez.top();
rez.pop();
prod *= rez.top();
rez.pop();
rez.push(prod);
}else if(fp[i] == -4) {
int numitor = rez.top(); //impart numarul de jos la cel aactual
rez.pop();
int numarator = rez.top();
rez.pop();
rez.push(numarator / numitor);
}else rez.push(fp[i]);
}
cout << rez.top();
return 0;
}