Pagini recente » Cod sursa (job #2822703) | Cod sursa (job #1605586) | Cod sursa (job #1043319) | Cod sursa (job #2868785) | Cod sursa (job #984286)
Cod sursa(job #984286)
#include <fstream>
#include <string>
#include <sstream>
#include <stack>
void parse(std::string& str, std::stringstream& nstr)
{
std::stack<char> myS;
for(unsigned 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();
}
}
long long reg(std::string& str)
{
std::stack<int> myS;
std::stringstream nstr;
parse(str, nstr);
int a, b;
char c = nstr.get();
while(c != -1)
{
if(c >= '0' && c <= '9')
{
std::stringstream nr;
while(c >= '0' && c <= '9')
{
nr << c;
c = nstr.get();
}
nr >> a;
myS.push(a);
continue;
}
else if(c == '+')
{
b = myS.top();
myS.pop();
a = myS.top();
myS.pop();
myS.push(a + b);
}
else if(c == '-')
{
b = myS.top();
myS.pop();
a = myS.top();
myS.pop();
myS.push(a - b);
}
else if(c == '*')
{
b = myS.top();
myS.pop();
a = myS.top();
myS.pop();
myS.push(a * b);
}
else if(c == '/')
{
b = myS.top();
myS.pop();
a = myS.top();
myS.pop();
myS.push(a / b);
}
c = nstr.get();
}
return myS.top();
}
int main()
{
std::ifstream in("evaluare.in");
std::ofstream out("evaluare.out");
std::string str, nstr;
getline(in, str);
out << reg(str);
return 0;
}