Pagini recente » Cod sursa (job #2212711) | Cod sursa (job #1172991) | Cod sursa (job #2171050) | Cod sursa (job #368040) | Cod sursa (job #2865281)
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <cstring>
#include <climits>
#define NMAX 100003
using namespace std;
int n,nivOp=0,nivNum=0;
char stivOp[NMAX],s[NMAX];
int stivNum[NMAX];
FILE *fin,*fout;
int calc(int a,int b,char op)
{
if(op=='+')
{
return a+b;
}
else if(op=='-')
{
return a-b;
}
else if(op=='*')
{
return a*b;
}
else if(op=='/')
{
return a/b;
}
return 0;
}
int rang(char ch)
{
if(ch=='+' || ch=='-')
{
return 1;
}
else if(ch=='*' || ch=='/')
{
return 2;
}
return 0;
}
int main()
{
fin=fopen("evaluare.in","r");
fout=fopen("evaluare.out","w");
fgets(s,NMAX,fin);
n=strlen(s)-1;
if(!(s[n]>='0' && s[n]<='9'))
{
n--;
}
for(int i=0; i<=n; i++)
{
char ch=s[i];
if(ch=='(')
{
stivOp[++nivOp]='(';
}
else if(ch==')')
{
//caut pana dau de caracterul (
while(nivOp>0 && stivOp[nivOp]!='(')
{
int rez=calc(stivNum[nivNum-1],stivNum[nivNum],stivOp[nivOp]);
stivNum[--nivNum]=rez;
nivOp--;
}
nivOp--;
}
else{
if(ch>='0' && ch<='9')
{
//e num
int val=0;
while(i<=n && s[i]>='0' && s[i]<='9')
{
val=val*10+s[i]-'0';
i++;
}
i--;
stivNum[++nivNum]=val;
}
else{
//e operator
while(nivOp>0 && rang(ch)<=rang(stivOp[nivOp]))
{
int rez=calc(stivNum[nivNum-1],stivNum[nivNum],stivOp[nivOp]);
stivNum[--nivNum]=rez;
nivOp--;
}
stivOp[++nivOp]=ch;
}
}
}
while(nivOp>0)
{
int rez=calc(stivNum[nivNum-1],stivNum[nivNum],stivOp[nivOp]);
stivNum[--nivNum]=rez;
nivOp--;
}
fprintf(fout,"%d",stivNum[1]);
return 0;
}