Pagini recente » Cod sursa (job #59394) | Cod sursa (job #541398) | Cod sursa (job #3003727) | Cod sursa (job #3032434) | Cod sursa (job #3273554)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
string s;
deque <char> stiva_operatori;
deque <int> stiva_numere;
int operator_priority(char c) {
if(c == '(' || c == ')')
return 0;
if(c == '+' || c == '-')
return 1;
if(c == '*' || c == '/')
return 2;
}
bool is_operator(char c) {
if(c == '+') return true;
if(c == '*') return true;
if(c == '/') return true;
if(c == '-') return true;
if(c == '(') return true;
if(c == ')') return true;
return false;
}
int calculeaza(int a, int b, char opr) {
if(opr == '+') return a + b;
if(opr == '-') return a - b;
if(opr == '/') return a / b;
if(opr == '*') return a * b;
}
int main()
{
fin >> s;
// parcurg stringul care este expresia
for(int i = 0; i < s.size(); i++) {
// cazul 1 - s[i] este cifra:
// parsez numarul si il bag in stiva_numere
if(isdigit(s[i])) {
int nr = 0;
while(i < s.size() && isdigit(s[i])) {
nr = nr * 10 + s[i] - '0';
i++;
}
i--;
stiva_numere.push_back(nr);
continue;
}
// cazul 2 - s[i] == '('
if(s[i] == '(') {
stiva_operatori.push_back(s[i]);
continue;
}
// cazul 3 - s[i] == ')'
if(s[i] == ')') {
while(stiva_operatori.back() != '(') {
char opr = stiva_operatori.back();
stiva_operatori.pop_back();
int a, b;
b = stiva_numere.back();
stiva_numere.pop_back();
a = stiva_numere.back();
stiva_numere.pop_back();
int rezultat = calculeaza(a, b, opr);
stiva_numere.push_back(rezultat);
}
stiva_operatori.pop_back();
continue;
}
// cazul 4 - s[i] este operator
if(is_operator(s[i])) {
// cat timp operatorul din varful stivei are prioritate
// mai mare sau egala cu cel curent fac operatii
while(stiva_operatori.size() > 0 && operator_priority(stiva_operatori.back()) >= operator_priority(s[i])) {
char opr = stiva_operatori.back();
stiva_operatori.pop_back();
int a, b;
b = stiva_numere.back();
stiva_numere.pop_back();
a = stiva_numere.back();
stiva_numere.pop_back();
int rezultat = calculeaza(a, b, opr);
stiva_numere.push_back(rezultat);
}
stiva_operatori.push_back(s[i]);
}
}
while(stiva_operatori.size() > 0) {
char opr = stiva_operatori.back();
stiva_operatori.pop_back();
int a, b;
b = stiva_numere.back();
stiva_numere.pop_back();
a = stiva_numere.back();
stiva_numere.pop_back();
int rezultat = calculeaza(a, b, opr);
stiva_numere.push_back(rezultat);
}
fout << stiva_numere.back();
return 0;
}