Pagini recente » Statistici Lorincz Szabolcs (LorinczSzabolcs) | Cod sursa (job #321508) | Cod sursa (job #2206772) | Cod sursa (job #763056) | Cod sursa (job #1592306)
#include<fstream>
#include<stack>
#include<string.h>
using namespace std;
ifstream f("exp.in");
ofstream g("exp.out");
char V[100001];
struct el{int val; char op; bool tip;} A[100001],B[100001];
stack<char> S;
stack<int> Q;
int prioritate(int c)
{
int pr=0;
if(c=='+'||c=='-') pr=1;
if(c=='/'||c=='*') pr=2;
return pr;
}
int main()
{
f>>V;
int L=strlen(V);
///prelucram sirul V in sirul A, astfel incat A.tip =1 pentru operanzi, iar A.tip=0 pentru operatii
///Unde A.tip==1, adica unde avem un operand, vom pune in A.val, valoarea intreaga a operandului
///Unde A.tip==0, adica unde avem o operatie, vom pune in A.op tipul operatiei: ( ) + - * /
int N=-1;
for(int i=0;i<L;++i)
{
N++;
if(V[i]>='0'&&V[i]<='9')
{
int f=0;
while(V[i]>='0'&&V[i]<='9')
{
f=f*10+V[i]-48;
i++;
}
i--;
A[N].tip=1;
A[N].val=f;
}
else
{
A[N].tip=0;
A[N].op=V[i];
}
}
int j=-1;
for(int i=0;i<=N;++i)
{
if(A[i].tip==1)
{
j++;
B[j].tip=1;
B[j].val=A[i].val;
}
if(A[i].tip==0&&A[i].op=='(')
{
S.push(A[i].op);
}
if(A[i].tip==0&&A[i].op==')')
{
while(!S.empty()&&S.top()!='(')
{
j++;
B[j].tip=0; B[j].op=S.top();
S.pop();
}
S.pop();
}
if(A[i].tip==0&&(A[i].op=='+'||A[i].op=='-'||A[i].op=='*'||A[i].op=='/'))
{
if(S.empty())
{
S.push(A[i].op);
}
else
{
while(!S.empty()&&prioritate(S.top())>prioritate(A[i].op))
{
j++;
B[j].tip=0; B[j].op=S.top();
S.pop();
}
S.push(A[i].op);
}
}
}
while(!S.empty())
{
j++;
B[j].tip=0; B[j].op=S.top();
S.pop();
}
/* for(int i=0;i<=j;++i)
{
if(B[i].tip) g<<B[i].val<<" ";
else g<<B[i].op<<" ";
}
g<<'\n';*/
//acum avand scrisa expresia in forma poloneza inversa (postfix), rezolvam expresia mai usor
for(int i=0;i<=j;++i)
{
if(B[i].tip==0&&B[i].op=='+')
{
int a=Q.top(); Q.pop();
int b=Q.top(); Q.pop();
Q.push(a+b);
}
if(B[i].tip==0&&B[i].op=='-')
{
int a=Q.top(); Q.pop();
int b=Q.top(); Q.pop();
Q.push(b-a);
}
if(B[i].tip==0&&B[i].op=='*')
{
int a=Q.top(); Q.pop();
int b=Q.top(); Q.pop();
Q.push(a*b);
}
if(B[i].tip==0&&B[i].op=='/')
{
int a=Q.top(); Q.pop();
int b=Q.top(); Q.pop();
Q.push(b/a);
}
if(B[i].tip==1)
{
Q.push(B[i].val);
}
}
g<<Q.top()<<'\n';
return 0;
}