Pagini recente » Cod sursa (job #830008) | Rating Albota Eric (Hunaja) | Cod sursa (job #972685) | Cod sursa (job #1737) | Cod sursa (job #1276129)
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <string.h>
#include <stack>
#include <algorithm>
#define Nmax 300001
using namespace std;
int priority(char x)
{
if(x == '+')
return 1;
if(x == '-')
return 1;
if(x == '*')
return 2;
if(x == '/')
return 2;
}
char* getPostfix(char* s)
{
char res[Nmax];
int sz = strlen(s), cnt = 0;
bool is_number = false;
stack<char> S;
for(int i=0;i<sz;++i)
{
if(s[i] == '\n')
continue;
if(s[i] >= '0' && s[i] <= '9')
{
is_number = true;
res[cnt++] = s[i];
} else {
if(is_number)
{
res[cnt++] = ' ';
is_number = false;
}
if(s[i] == '(')
{
S.push(s[i]);
continue;
}
if(s[i] == ')')
{
while(S.top() != '(')
{
res[cnt++] = S.top();
S.pop();
}
S.pop();
continue;
}
while(!S.empty() && S.top() != '(' && S.top() != ')' && priority(s[i]) <= priority(S.top()))
{
res[cnt++] = S.top();
S.pop();
}
S.push(s[i]);
}
}
while(!S.empty())
{
res[cnt++] = S.top();
S.pop();
}
return res;
}
int evaluatePostfix(char *res)
{
int sz = strlen(res), nr = 0, sol = 0;
bool is_number = false;
stack<int> S;
for(int i=0;i<sz;++i)
{
if(res[i] >= '0' && res[i] <= '9')
{
is_number = true;
nr = nr * 10 + (res[i] - '0');
} else {
if(is_number)
{
S.push(nr);
nr = 0;
is_number = false;
}
if(res[i] == ' ')
continue;
int y = S.top(); S.pop();
int x = S.top(); S.pop();
if(res[i] == '+')
{
S.push(x+y);
} else if(res[i] == '*')
S.push(x*y);
else if(res[i] == '-')
S.push(x-y);
else if(res[i] == '/')
{
S.push(x/y);
}
}
}
return S.top();
}
int main()
{
char buf[Nmax];
ifstream f("evaluare.in");
f.getline(buf, Nmax);
f.close();
ofstream g("evaluare.out");
g<<evaluatePostfix(getPostfix(buf));
g.close();
return 0;
}