Pagini recente » Cod sursa (job #2972) | Cod sursa (job #2028869) | Cod sursa (job #687593) | Cod sursa (job #2986850) | Cod sursa (job #1510488)
#include <cstdio>
#include <cstring>
#include <stack>
#include <math.h>
using namespace std;
stack<int> numere;
stack<char> semne;
char x[100100];
char semneTemplate[4][2];
void initializare()
{
semneTemplate[0][0] = '(';
semneTemplate[0][1] = ')';
semneTemplate[1][0] = '*';
semneTemplate[1][1] = '/';
semneTemplate[2][0] = '+';
semneTemplate[2][1] = '-';
}
int compareSign(char p)
{
if(p == '+' || p == '-') return 1;
if(p == '*' || p == '/') return 2;
return 0;
}
void handleSign()
{
int nr1, nr2;
nr2 = numere.top();
numere.pop();
nr1 = numere.top();
numere.pop();
char p = semne.top();
semne.pop();
if(p == '+')
{
numere.push(nr1 + nr2);
}
else if(p == '-')
{
numere.push(nr1 - nr2);
}
else if(p == '*')
{
numere.push(nr1 * nr2);
}
else if(p == '/')
{
numere.push(nr1 / nr2);
}
}
int evaluare()
{
semne.push('$');
int n = strlen(x);
int m, px;
for(int i = 0; i < n; i++){
if(x[i] == '('){
semne.push(x[i]);
} else {
if(x[i] == ')'){
while(semne.top() != '('){
handleSign();
}
semne.pop();
} else {
px = compareSign(x[i]);
if(px){
while(compareSign(semne.top()) >= px){
handleSign();
}
semne.push(x[i]);
} else {
m = 0;
while(x[i] >= '0' && x[i] <= '9'){
m = m * 10 + (x[i] - '0');
i++;
}
i--;
numere.push(m);
}
}
}
}
while(semne.size() > 1){
handleSign();
}
return numere.top();
}
int main()
{
freopen("evaluare.in", "r", stdin);
freopen("evaluare.out", "w", stdout);
gets(x);
initializare();
printf("%d", evaluare());
return 0;
}