Pagini recente » Cod sursa (job #2869543) | Cod sursa (job #266744) | Cod sursa (job #3209600) | Cod sursa (job #2274891) | Cod sursa (job #1713643)
#include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;
struct Node
{
float numar;
Node *next;
};
Node *head = NULL;
void adauga(float x)
{
Node *temp = new Node;
temp->numar = x;
temp->next = head;
head = temp;
}
float elimina()
{
Node *temp = head;
head = head->next;
return temp->numar;
}
int esteGoala()
{
if(head==NULL)
return 1;
return 0;
}
string InfixToPostfix(string s)
{
string s1;
for(unsigned int i=0;i<=s.length()-1;i++)
{
switch (s.at(i))
{
case '(':
adauga('(');
break;
case ')':
while(head->numar!='('){
char x;
x=elimina();
switch (x)
{
case '+':
s1=s1+' ';
s1=s1+'+';
break;
case '-':
s1=s1+' ';
s1=s1+'-';
break;
case '*':
s1=s1+' ';
s1=s1+'*';
break;
case '/':
s1=s1+' ';
s1=s1+'/';
break;
}
}
elimina();
break;
case '+':
while(!esteGoala()&&(head->numar=='*'||head->numar=='/'||head->numar=='-'||head->numar=='+'))
{
if(head->numar=='*')
{
s1=s1+' ';
s1=s1+'*';
elimina();
}
else if(head->numar=='/')
{
s1=s1+' ';
s1=s1+'/';
elimina();
}
else if(head->numar=='-')
{
s1=s1+' ';
s1=s1+'-';
elimina();
}
else if(head->numar=='+')
{
s1=s1+' ';
s1=s1+'+';
elimina();
}
}
s1=s1+' ';
adauga('+');
break;
case '-':
while(!esteGoala()&&(head->numar=='*'||head->numar=='/'||head->numar=='-'||head->numar=='+'))
{
if(head->numar=='*')
{
s1=s1+' ';
s1=s1+'*';
elimina();
}
else if(head->numar=='/')
{
s1=s1+' ';
s1=s1+'/';
elimina();
}
else if(head->numar=='-')
{
s1=s1+' ';
s1=s1+'-';
elimina();
}
else if(head->numar=='+')
{
s1=s1+' ';
s1=s1+'+';
elimina();
}
}
s1=s1+' ';
adauga('-');
break;
case '/':
while(!esteGoala()&&(head->numar=='*'||head->numar=='/'))
{
if(head->numar=='*')
{
s1=s1+' ';
s1=s1+'*';
elimina();
}
else if(head->numar=='/')
{
s1=s1+' ';
s1=s1+'/';
elimina();
}
}
s1=s1+' ';
adauga('/');
break;
case '*':
while(!esteGoala()&&(head->numar=='*'||head->numar=='/'))
{
if(head->numar=='*')
{
s1=s1+' ';
s1=s1+'*';
elimina();
}
else if(head->numar=='/')
{
s1=s1+' ';
s1=s1+'/';
elimina();
}
}
s1=s1+' ';
adauga('*');
break;
default:
s1=s1+s.at(i);
break;
}
}
while(!esteGoala())
{
char x;
x=elimina();
switch (x)
{
case '+':
s1=s1+' ';
s1=s1+'+';
break;
case '-':
s1=s1+' ';
s1=s1+'-';
break;
case '*':
s1=s1+' ';
s1=s1+'*';
break;
case '/':
s1=s1+' ';
s1=s1+'/';
break;
}
}
return s1;
}
void evalPostfix(string S)
{
float m,n,res,x=0;
for(unsigned int i=0;i<=S.length()-1;i++)
{
switch (S.at(i))
{
case '+':
n = elimina();
m = elimina();
res = m+n;
adauga(res);
break;
case '-':
n = elimina();
m = elimina();
res = m-n;
adauga(res);
break;
case '*':
n = elimina();
m = elimina();
res = m*n;
adauga(res);
break;
case '/':
n = elimina();
m = elimina();
res = m/n;
adauga(res);
break;
case ' ':
break;
default:
x = x * 10 + (S.at(i)-'0');
if(i<S.length()-1)
if(S.at(i+1)<'0'||S.at(i+1)>'9')
{
adauga(x);
x=0;
}
break;
}
}
}
int main()
{
freopen("evaluare.in","r",stdin);
freopen("evaluare.out","w",stdout);
string exp1,exp2;
cin>>exp1;
exp2=InfixToPostfix(exp1);
cout<<"Forma postfixa este: ";
for(unsigned int i=0;i<=exp2.length()-1;i++)
cout<<exp2.at(i);
evalPostfix(exp2);
cout<<endl;
cout<<"Rezultatul expresiei este: "<<elimina();
return 0;
}