Pagini recente » Cod sursa (job #51747) | Cod sursa (job #2036458) | Cod sursa (job #2379711) | Cod sursa (job #1463095) | Cod sursa (job #984283)
Cod sursa(job #984283)
#include <fstream>
#include <string>
#include <sstream>
#include <stack>
void parse(std::string& str, std::string& n)
{
std::stack<char> myS;
std::stringstream nstr;
for(int i = 0; i < str.length();)
{
if(str[i] == '(') myS.push('(');
else if(str[i] == ')')
{
while(myS.top() != '(')
{
nstr << myS.top();
nstr << ' ';
myS.pop();
}
myS.pop();
}
else if(str[i] == '+' || str[i] == '-')
{
while(!myS.empty() && myS.top() != '(')
{
nstr << myS.top();
nstr << ' ';
myS.pop();
}
myS.push(str[i]);
}
else if(str[i] == '*' || str[i] == '/')
{
while(!myS.empty() && myS.top() != '(' && myS.top() != '+' && myS.top() != '-')
{
nstr << myS.top();
nstr << ' ';
myS.pop();
}
myS.push(str[i]);
}
else
{
while(str[i] >= '0' && str[i] <= '9')
{
nstr << str[i];
i++;
}
nstr << ' ';
continue;
}
i++;
}
while(!myS.empty())
{
nstr << myS.top();
nstr << ' ';
myS.pop();
}
getline(nstr, n);
}
long long reg(std::string& str)
{
std::stack<int> myS;
int a, b;
for(int i = 0; i < str.length();)
{
if(str[i] >= '0' && str[i] <= '9')
{
std::stringstream nr;
while(str[i] >= '0' && str[i] <= '9')
{
nr << str[i];
i++;
}
nr >> a;
myS.push(a);
continue;
}
else if(str[i] == '+')
{
b = myS.top();
myS.pop();
a = myS.top();
myS.pop();
myS.push(a + b);
}
else if(str[i] == '-')
{
b = myS.top();
myS.pop();
a = myS.top();
myS.pop();
myS.push(a - b);
}
else if(str[i] == '*')
{
b = myS.top();
myS.pop();
a = myS.top();
myS.pop();
myS.push(a * b);
}
else if(str[i] == '/')
{
b = myS.top();
myS.pop();
a = myS.top();
myS.pop();
myS.push(a / b);
}
i++;
}
return myS.top();
}
int main()
{
std::ifstream in("evaluare.in");
std::ofstream out("evaluare.out");
std::string str, nstr;
getline(in, str);
parse(str, nstr);
out << reg(nstr);
return 0;
}