Pagini recente » Cod sursa (job #878845) | Cod sursa (job #883008) | Cod sursa (job #831548) | Cod sursa (job #1684536) | Cod sursa (job #2043469)
#include <cstdio>
#include <cstring>
#define N 100005
using namespace std;
char ec[N];
int n, nr[27], lung;
int caut_prim(int start, int fin)
{
for(int i=start;i<=fin;i++)
{
if(ec[i]=='(')
while(ec[i+1]!=')')
i++;
else
if((ec[i]=='+' || ec[i]=='-')&&!strchr("+*-", ec[i-1]) && !(strchr("+-", ec[i+1])))
return i;
}
return -1;
}
int caut_doi(int start, int fin)
{
for(int i=start;i<=fin;i++)
if(ec[i]=='*')
return i;
return -1;
}
int parcurg(int st, int dr)
{
if(st==dr && ec[st]!=')')
return nr[ec[st]-'a'+1];
if(ec[dr]==')')
return parcurg(st, dr-1);
int mij=caut_prim(st, dr);
if(mij>0 && ec[mij]=='+')
return parcurg(st, mij-1)+parcurg(mij+1, dr);
else
if(mij>0)
return parcurg(st, mij-1)-parcurg(mij+1, dr);
else
{
mij=caut_doi(st, dr);
if(mij>0)
return parcurg(st, mij-1)*parcurg(mij+1, dr);
else
if(ec[st]=='[')
return parcurg(st+1, dr-1)*parcurg(st+1, dr-1);
else
if(ec[st]=='(')
return parcurg(st+1, dr);
else
if(ec[st]=='-')
return -1*parcurg(st+1, dr);
else
if(ec[st]=='+')
return parcurg(st+1, dr);
}
}
int main()
{
freopen("eval.in", "r", stdin);
freopen("eval.out", "w", stdout);
scanf("%d\n", &n);
for(int i=1;i<=n;i++)
scanf("%d\n", &nr[i]);
fgets(ec, N, stdin);
lung=strlen(ec)-1;
if(ec[lung]=='\n')
lung--;
printf("%d", parcurg(0, lung));
return 0;
}