Pagini recente » Cod sursa (job #1824411) | Cod sursa (job #3227198) | Cod sursa (job #425983) | Cod sursa (job #1621515) | Cod sursa (job #2538236)
#include <bits/stdc++.h>
#define N 100005
using namespace std;
ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");
vector <int> polon;
char s[N];
inline bool Prioritate(char c)
{
return c=='*'|| c=='/';
}
void Adauga(char c)
{
if (c=='+') polon.push_back(-1);
if (c=='-') polon.push_back(-2);
if (c=='*') polon.push_back(-3);
if (c=='/') polon.push_back(-4);
}
void FormaPoloneza()
{
char oper[N];
int n=strlen(s);
int no=0;
int i;
int nr;
for (i=0; i<n; ++i)
if (isdigit(s[i]))
{
nr=0;
while (isdigit(s[i])) nr=nr*10+s[i]-'0', i++;
i--;
polon.push_back(nr);
}
else if (s[i]=='(') oper[++no]='(';
else if (s[i]==')')
{
while (oper[no]!='(') Adauga(oper[no]), no--;
no--;
}
else if (no==0) oper[++no]=s[i];
else if (oper[no]=='(') oper[++no]=s[i];
else
{
int p1=Prioritate(s[i]);
int p2=Prioritate(oper[no]);
if (p1<p2)
{
while (no>=1 && oper[no]!='(' && p1<p2)
Adauga(oper[no]), no--, p2=Prioritate(oper[no]);
oper[++no]=s[i];
}
else if (p1==p2)
{
Adauga(oper[no]), no--;
oper[++no]=s[i];
}
else oper[++no]=s[i];
}
while (no>=1) Adauga(oper[no]), no--;
}
void Afisare()
{
int i;
for (i=0; i<polon.size(); ++i)
fout<<polon[i]<<' ';
fout<<'\n';
}
void EvaluareExpresie()
{
///prima valoare din vector va reprezenta rezultatul expresiei
int i;
int x;
stack <int> sol;
for (i=0; i<polon.size(); ++i)
{
if (polon[i]>=0) sol.push(polon[i]);
else ///inseamna ca este operator
{
if (polon[i]==-1)
{
x=sol.top();
sol.pop();
x=x+sol.top();
sol.pop();
sol.push(x);
}
if (polon[i]==-2)
{
x=sol.top();
sol.pop();
x=sol.top()-x;
sol.pop();
sol.push(x);
}
if (polon[i]==-3)
{
x=sol.top();
sol.pop();
x=x*sol.top();
sol.pop();
sol.push(x);
}
if (polon[i]==-4)
{
x=sol.top();
sol.pop();
x=sol.top()/x;
sol.pop();
sol.push(x);
}
}
}
fout<<sol.top()<<'\n';
fout.close();
}
int main()
{
fin>>s;
fin.close();
FormaPoloneza();
EvaluareExpresie();
return 0;
}