Pagini recente » Cod sursa (job #2789584) | Cod sursa (job #1797354) | Cod sursa (job #834928) | Cod sursa (job #3213558) | Cod sursa (job #2804198)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
stack <char> op;
stack <int> nr;
string expression;
long long p=0;
long long operation(long long x,long long y,char semn)
{
switch(semn)
{
case '+':
return x+y;
case '-':
return x-y;
case '*':
return x*y;
case '/':
return x/y;
}
}
long long nextnum()
{
long long next=0;
while(isdigit(expression[p]))
next=next*10+expression[p++]-'0';
return next;
}
bool priority(char s1, char s2)
{
if(s1=='(')
return true;
if((s1=='+' || s1=='-') && (s2=='*' || s2=='/'))
return true;
return false;
}
void calcul()
{
do
{
long long nr1,nr2;
char semn=op.top();
nr1=nr.top();
nr.pop();
nr2=nr.top();
nr.pop();
op.pop();
nr.push(operation(nr2,nr1,semn));
}while(!op.empty() && priority(op.top(),expression[p])==0);
}
void evaluate()
{
while(p<(int)expression.size())
{
switch(expression[p])
{
case '(':
op.push(expression[p++]);
break;
case ')':
while(op.top()!='(')
calcul();
op.pop();
p++;
break;
case '+':
case '-':
case '*':
case '/':
if(op.empty() || priority(op.top(),expression[p]))
op.push(expression[p++]);
else
{
calcul();
op.push(expression[p++]);
}
break;
default:
nr.push(nextnum());
}
}
while(!op.empty() && priority(op.top(),expression[p])==0)
{
long long nr1,nr2;
char semn=op.top();
nr1=nr.top();
nr.pop();
nr2=nr.top();
nr.pop();
op.pop();
nr.push(operation(nr2,nr1,semn));
}
fout<<nr.top();
}
int main()
{
fin>>expression;
evaluate();
return 0;
}