Pagini recente » Cod sursa (job #1454378) | Cod sursa (job #1379262) | Cod sursa (job #166387) | Cod sursa (job #37848) | Cod sursa (job #2855567)
#include <iostream>
#include <fstream>
#include <stack>
#include <cstring>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
stack <char> operanzi;
stack <float> operatori;
char sir[100001];
int main()
{
f>>sir;
int n=strlen(sir);
for(int i=0; i<n; i++)
{
if(isdigit(sir[i]))
{
int x=0;
while(i<n && isdigit(sir[i]))
{
x=x*10+sir[i]-'0';
i++;
}
i--;
operatori.push(x);
}
else if(sir[i]==')' && !operanzi.empty())
{
if(operanzi.top()=='(') operanzi.pop();
else
{
while(operanzi.top()!='(')
{
int x=operatori.top();
operatori.pop();
int y=operatori.top();
operatori.pop();
char c=operanzi.top();
operanzi.pop();
if(c=='*') operatori.push(x*y);
else if(c=='-')
{
int X=x, Y=y;
operatori.push(Y-X);
}
else if(c=='+')
{
int X=x, Y=y;
operatori.push(Y+X);
}
else operatori.push((float)y/x);
}
operanzi.pop();
}
}
else if(operanzi.empty()) operanzi.push(sir[i]);
else if(sir[i]=='(') operanzi.push(sir[i]);
else
{
if(sir[i]=='*' || sir[i]=='/') operanzi.push(sir[i]);
else
{
while(!operanzi.empty() && (operanzi.top()=='*' || operanzi.top()=='/'))
{
int x=operatori.top();
operatori.pop();
int y=operatori.top();
operatori.pop();
char c=operanzi.top();
operanzi.pop();
if(c=='*') operatori.push(x*y);
else operatori.push((float)y/x);
}
operanzi.push(sir[i]);
}
}
}
while(!operanzi.empty())
{
if(operanzi.top()=='(') operanzi.pop();
else
{
float x=operatori.top();
operatori.pop();
float y=operatori.top();
operatori.pop();
char c=operanzi.top();
operanzi.pop();
if(c=='*') operatori.push(x*y);
else if(c=='-')
{
int X=x, Y=y;
operatori.push(Y-X);
}
else if(c=='+')
{
int X=x, Y=y;
operatori.push(Y+X);
}
else operatori.push((float)y/x);
}
}
g<<operatori.top();
}