Pagini recente » Cod sursa (job #785816) | Cod sursa (job #2767743) | Cod sursa (job #3124238) | Cod sursa (job #565619) | Cod sursa (job #1592357)
#include<fstream>
#include<string.h>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
char V[100001];
struct el{int val; char op; bool tip;} A[100001],B[100001];
char S[100001];
int Q[100001],QT,ST;
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; ST=0; QT=0;
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=='(')
{
ST++;
S[ST]=A[i].op;
}
if(A[i].tip==0&&A[i].op==')')
{
while(S[ST]!='(')
{
j++;
B[j].tip=0; B[j].op=S[ST];
ST--;
}
ST--;
}
if(A[i].tip==0&&(A[i].op=='+'||A[i].op=='-'||A[i].op=='*'||A[i].op=='/'))
{
if(ST==0)
{
ST++;
S[ST]=A[i].op;
}
else
{
while(ST>0&&prioritate(S[ST])>=prioritate(A[i].op))
{
j++;
B[j].tip=0; B[j].op=S[ST];
ST--;
}
ST++;
S[ST]=A[i].op;
}
}
}
while(ST>0)
{
j++;
B[j].tip=0; B[j].op=S[ST];
ST--;
}
/* 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[QT]; QT--;
int b=Q[QT]; QT--;
QT++;
Q[QT]=b+a;
}
if(B[i].tip==0&&B[i].op=='-')
{
int a=Q[QT]; QT--;
int b=Q[QT]; QT--;
QT++;
Q[QT]=b-a;
}
if(B[i].tip==0&&B[i].op=='*')
{
int a=Q[QT]; QT--;
int b=Q[QT]; QT--;
QT++;
Q[QT]=b*a;
}
if(B[i].tip==0&&B[i].op=='/')
{
int a=Q[QT]; QT--;
int b=Q[QT]; QT--;
QT++;
Q[QT]=b/a;
}
if(B[i].tip==1)
{
QT++;
Q[QT]=B[i].val;
}
}
g<<Q[QT]<<'\n';
return 0;
}