Mai intai trebuie sa te autentifici.
Cod sursa(job #1507345)
Utilizator | Data | 21 octombrie 2015 16:59:37 | |
---|---|---|---|
Problema | Evaluarea unei expresii | Scor | 10 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 3 kb |
#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] = '/';
semneTemplate[3][0] = '+';
semneTemplate[3][1] = '-';
}
int compareSign(char p)
{
for(int i = 0; i < 4; i++)
{
for(int j = 0; j < 2; j++)
{
if(p == semneTemplate[i][j])
{
return i;
}
}
}
}
void handleSign(char p)
{
int nr1, nr2;
nr2 = numere.top();
numere.pop();
nr1 = numere.top();
numere.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);
}
else if(p == '^')
{
numere.push(pow(nr1, nr2));
}
}
int evaluare()
{
char tmp[10];
char tmpx[10];
int nr = 0;
for(int i = 0; i < strlen(x); i++)
{
if(x[i] >= '0' && x[i] <= '9')
{
tmpx[0] = '\0';
while(x[i] >= '0' && x[i] <= '9')
{
if(strlen(tmpx) == 0)
{
tmpx[1] = '\0';
}
tmpx[strlen(tmpx)] = '\0';
tmpx[strlen(tmpx)] = x[i];
i++;
}
int m;
sscanf(tmpx, "%d", &m);
i--;
numere.push(m);
}
else
{
if(x[i] == '(')
{
semne.push('(');
continue;
}
else if(x[i] == ')')
{
while(semne.top() != '(')
{
handleSign(semne.top());
semne.pop();
}
semne.pop();
}
else if(!semne.empty())
{
if(compareSign(x[i]) >= compareSign(semne.top()) && semne.top() != '(')
{
handleSign(semne.top());
semne.pop();
semne.push(x[i]);
}
else
{
semne.push(x[i]);
}
}
else
{
semne.push(x[i]);
}
}
}
while(!semne.empty())
{
handleSign(semne.top());
semne.pop();
}
return numere.top();
}
int main()
{
freopen("evaluare.in", "r", stdin);
freopen("evaluare.out", "w", stdout);
gets(x);
initializare();
printf("%d", evaluare());
return 0;
}