Pagini recente » Cod sursa (job #2680454) | Cod sursa (job #720055) | Cod sursa (job #3238203) | Cod sursa (job #3206982) | Cod sursa (job #1508583)
#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[15];
char tmpx[15];
int nrx = 0;
int nr = 0;
int l = strlen(x);
for(int i = 0; i < l; i++)
{
if(i == 0 && x[0] == '-')
{
numere.push(0);
}
if(x[i] >= '0' && x[i] <= '9')
{
nrx = 0;
while(x[i] >= '0' && x[i] <= '9')
{
tmpx[nrx + 1] = '\0';
tmpx[nrx] = x[i];
i++;
nrx++;
}
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;
}