Pagini recente » Cod sursa (job #1661314) | Istoria paginii runda/testround12/clasament | Cod sursa (job #967068) | Autentificare | Cod sursa (job #1574233)
#include <fstream>
#include <algorithm>
#include <string>
#include <stack>
using namespace std;
string expr, semn, eval, ss;
int p[256];
stack <int> st;
int main ()
{
p['('] = p[')'] = 0;
p['+'] = p['-'] = 1;
p['*'] = p['/'] = 2;
ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");
fin >> expr;
expr = '(' + expr + ')';
for (int i = 0; i < expr.size (); ++i)
{
if ('0' <= expr[i] && expr[i] <= '9') eval += expr[i];
else if ('0' <= expr[i - 1] && expr[i - 1] <= '9') eval += ",";
else
{
while (!semn.empty () && p[semn[semn.size () - 1]] >= p[expr[i]])
{
eval += semn[semn.size () - 1];
semn.erase (semn.size () - 1, 1);
}
eval += ",";
semn += expr[i];
}
}
bool OK = true;
int nr = 0;
for (int i = 0; i < eval.size (); ++i)
{
if (eval[i] != ',')
{
ss += eval[i];
if (ss[i] < '0' || ss[i] > '9') OK = false;
if (OK) nr = nr * 10 + ss[i] - 48;
continue;
}
if (OK) st.push (nr);
else
for (int i = 0; i < ss.size (); ++i)
{
int rez = st.top ();
st.pop ();
if (ss[i] == '*') rez *= st.top ();
else if (ss[i] == '/') rez /= st.top ();
else if (ss[i] == '+') rez += st.top ();
else rez -= st.top ();
st.pop ();
st.push (rez);
}
ss.clear ();
nr = 0;
OK = true;
}
printf ("%d\n", st.top ());
return 0;
}