Pagini recente » Cod sursa (job #450220) | Cod sursa (job #353401) | Cod sursa (job #2304389) | Cod sursa (job #1977311) | Cod sursa (job #145994)
Cod sursa(job #145994)
using namespace std;
#define nmax 200005
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#include<stdio.h>
#include<fstream>
#include<string.h>
char c,d[nmax],p[nmax],q[nmax];
int ind,n,vf;
int stack[nmax],top;
void qin(char c) { q[vf]=c; vf++; }
inline char qout() { vf--; return q[vf]; }
inline int isempty() { if (vf==0) return 1; else return 0; }
void stin(int c) { stack[top]=c; top++; }
void read_input(void)
{
gets (d);
n = strlen (d) - 1;
}
void write_output(void)
{
printf("%d",stack[0]); printf("\n");
}
void interpret(void)
{
char s[20];
int i,j,k;
for (i=0; i<=ind; i++) {
if (p[i]>=48 && p[i]<=57)
{
memset(s,0,20); j=0;
while (p[i]>=48 && p[i]<=57)
{
s[j]=p[i]; j++; i++;
}
k=atoi(s);
stin(k);
}
if (p[i]=='+')
{
k=stack[top-1] + stack[top-2];
top-=2; stin(k);
}
if (p[i]=='-')
{
k=stack[top-2] - stack[top-1];
top-=2; stin(k);
}
if (p[i]=='*')
{
k=stack[top-1] * stack[top-2];
top-=2; stin(k);
}
if (p[i]=='/')
{
k=stack[top-2] / stack[top-1];
top-=2; stin(k);
}
}
}
void solve(void)
{
int i;
char c;
for (i=0; i<=n; i++)
{
if (d[i]>=48 && d[i]<=57)
{
while (d[i]>=48 && d[i]<=57) { p[ind]=d[i]; ind++; i++; }
p[ind]='.'; ind++;
}
if (d[i]=='(') qin('(');
if (d[i]==')')
while (!isempty())
{
c=qout();
if (c!='(') { p[ind]=c; ind++; }
else break;
}
if (d[i]=='+' || d[i]=='-')
{
while (!isempty())
{
if (q[vf-1]=='(') break;
c=qout(); p[ind]=c; ind++;
}
qin(d[i]);
}
if (d[i]=='*' || d[i]=='/')
{
while (!isempty())
{
if (q[vf-1]=='(') break;
if (q[vf-1]=='+' || q[vf-1]=='-') break;
c=qout(); p[ind]=c; ind++;
}
qin(d[i]);
}
}
while (isempty()==0) { p[ind]=qout(); ind++; }
ind--; interpret();
}
int main()
{
freopen ("evaluare.in", "r", stdin);
freopen ("evaluare.out", "w", stdout);
read_input(); solve(); write_output();
return 0;
}