Pagini recente » Cod sursa (job #1097990) | Cod sursa (job #1937308) | Cod sursa (job #461653) | Cod sursa (job #2591792) | Cod sursa (job #3182308)
#include <iostream>
#include <fstream>
#include <stack>
#include <cstring>
using namespace std;
char exp[100000];
int p;
stack <int> nrs;
stack <char> semne;
int eval(int a, int b, char s){
switch (s){
case '+':
return a + b;
break;
case '-':
return a - b;
break;
case '*':
return a * b;
break;
case '/':
return a / b;
break;
}
}
bool prioritate(int s1, int s2) {
if (s1 == '(') return true;
if ((s1 == '+' || s1 == '-') && (s2 == '*' || s2 == '/')) return true;
return false;
}
int getNum(){
int nr = 0;
for (; exp[p] >= '0' && exp[p] <= '9';)
nr = nr * 10 + (exp[p++] - '0');
return nr;
}
void getResult(){
int v1 = nrs.top();
nrs.pop();
int v2 = nrs.top();
nrs.pop();
char s = semne.top();
semne.pop();
nrs.push(eval(v2, v1, s));
}
int solve(int n){
while (p < n){
switch(exp[p]) {
case '(':
semne.push(exp[p++]);
break;
case ')':
while (semne.top() != '(')
getResult();
semne.pop();
p++;
break;
case '+':
case '-':
case '*':
case '/':
if (semne.empty() || prioritate(semne.top(), exp[p])){
semne.push(exp[p++]);
}
else {
do {
getResult();
}while (!semne.empty() && !prioritate(semne.top(), exp[p]));
semne.push(exp[p++]);
}
break;
default:
nrs.push(getNum());
break;
}
}
while (!semne.empty()){
getResult();
}
}
int main()
{
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
fin.getline(exp, 100000);
int len = strlen(exp);
solve(len);
fout << nrs.top();
return 0;
}