Pagini recente » Cod sursa (job #2383404) | Cod sursa (job #2766597) | Cod sursa (job #2975012) | Cod sursa (job #1178260) | Cod sursa (job #3233024)
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <stack>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char car[100001];
int precedenta(char op)
{
if(op=='+' || op=='-')
return 1;
if(op=='*' || op=='/')
return 2;
else
return 0;
}
int operatii(int n,int m, char c)
{
if(c=='+')
return n+m;
if(c=='-')
return n-m;
if(c=='*')
return n*m;
if(c=='/')
return n/m;
}
int evaluare(string expresie)
{
int i;
stack<int>valoare;
stack<char>operanzi;
int x=expresie.length();
for(i=0;i<x;i++)
{
if(expresie[i]==' ')
continue;
if(expresie[i]=='(')
{
operanzi.push(expresie[i]);
}
else
if(isdigit(expresie[i]))
{
int val=0;
while(i<x&& isdigit(expresie[i]))
{
val=(val*10)+(expresie[i]-'0');
i++;
}
valoare.push(val);
i--;
}
else
if(expresie[i]==')')
{
while(!operanzi.empty() && operanzi.top()!='(')
{
int val2=valoare.top();
valoare.pop();
int val1=valoare.top();
valoare.pop();
char op=operanzi.top();
operanzi.pop();
valoare.push(operatii(val1,val2,op));
}
if(!operanzi.empty())
operanzi.pop();
}
else
{
while(!operanzi.empty() && precedenta(operanzi.top())>=precedenta(expresie[i]))
{
int val2=valoare.top();
valoare.pop();
int val1=valoare.top();
valoare.pop();
char op=operanzi.top();
operanzi.pop();
valoare.push(operatii(val1,val2,op));
}
operanzi.push(expresie[i]);
}
}
while(!operanzi.empty())
{
int val2=valoare.top();
valoare.pop();
int val1=valoare.top();
valoare.pop();
char op=operanzi.top();
operanzi.pop();
valoare.push(operatii(val1,val2,op));
}
return valoare.top();
}
int main()
{
string sir;
getline(fin, sir);
fout << evaluare(sir);
return 0;
}