Pagini recente » Cod sursa (job #2858577) | Cod sursa (job #2545813) | Cod sursa (job #714289) | Cod sursa (job #573751) | Cod sursa (job #2302855)
#include <fstream>
#include <stack>
#include <cstring>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
char a[100005];
int p;
stack <char> op;
stack <int> nr;
int evaluare(int x, int y, char semn)
{
switch(semn)
{
case '+':
return x+y;
case '-':
return x-y;
case '/':
return x/y;
case '*':
return x*y;
}
}
int next()
{
int n=0;
while(a[p]>='0' && a[p]<='9')
n=n*10+(a[p++]-'0');
return n;
}
int prioritate(char s1, char s2)
{
if(s1=='(')
return 1;
if( (s1=='-' || s1=='+') && (s2=='*' || s2=='/'))
return 1;
return 0;
}
int main()
{
f.getline(a, 100005);
int l=strlen(a);
while(p<l)
{
switch(a[p])
{
case '(':
{
op.push(a[p++]);
break;
}
case ')':
{
while(op.top()!='(')
{
int v2=nr.top();
nr.pop();
int v1=nr.top();
nr.pop();
char semn=op.top();
op.pop();
nr.push(evaluare(v1, v2, semn));
}
op.pop();
p++;
break;
}
case'+':
case'-':
case'*':
case'/':
{
if(op.empty() || prioritate(op.top(),a[p])==1)
{
op.push(a[p++]);
}
else
{
do
{
int v2=nr.top();
nr.pop();
int v1=nr.top();
nr.pop();
char semn=op.top();
op.pop();
nr.push(evaluare(v1,v2,semn));
}
while(!op.empty() &&
prioritate(op.top(),a[p])==0);
op.push(a[p++]);
}
break;
}
default :
{
nr.push(next());
}
}
}
while(!op.empty())
{
int v2=nr.top();
nr.pop();
int v1=nr.top();
nr.pop();
char semn=op.top();
op.pop();
nr.push(evaluare(v1,v2,semn));
}
g<<nr.top();
return 0;
}