Pagini recente » Borderou de evaluare (job #3116651) | Cod sursa (job #216076) | Cod sursa (job #1696203) | Cod sursa (job #3214252) | Cod sursa (job #872810)
Cod sursa(job #872810)
#include <fstream>
#include <string.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char e[100001],s[50001],p[100001];
int v[101],i,j=-1,k;
int pr(char x)
{
if (x=='('||x==')') return 0;
if (x=='-'||x=='+') return 1;
if (x=='*'||x=='/') return 2;
}
void empty_stack (char x)
{
int y=pr(x);
while (y<pr(s[k])&&s[k]!='(')
{
p[++j]=s[k];
k--;
}
if (y==pr(s[k]))
{if (x==')') k--;}
else{ if (s[k]=='(') s[++k]=x; else{ p[++j]=s[k]; s[k]=x;}}
}
void operate (char x)
{
int a;
switch (x)
{
case '+':a=v[j]+v[j-1];break;
case '-':a=v[j-1]-v[j];break;
case '*':a=v[j]*v[j-1];break;
case '/':a=v[j-1]/v[j];break;
}
v[--j]=a;
}
int main()
{
s[0]='(';
fin>>e;
int l=strlen(e);
for (i=0;i<l;i++)
{
if (e[i]>='0'&&e[i]<='9') {p[++j]=e[i];continue;}
else p[++j]=' ';
if (pr(e[i])>pr(s[k])) s[++k]=e[i];
else {if (e[i]!='(') empty_stack(e[i]); else s[++k]=e[i];}
}
empty_stack (')');
p[++j]='\0';
l=strlen(p);
int nr=0; j=0; bool ok=0;
for (i=0;i<l;i++)
{
if (p[i]>='0'&&p[i]<='9') {nr=nr*10+(p[i]-48);ok=1; continue;}
else
{
if (ok)
{v[++j]=nr; nr=0; ok=0;}
if (p[i]==' ') continue;
}
operate (p[i]);
}
fout<<v[1];
}