Pagini recente » Cod sursa (job #1687919) | Cod sursa (job #3201759) | Cod sursa (job #2385575) | Cod sursa (job #3221154) | Cod sursa (job #1713646)
#include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;
struct Node
{
int numar;
Node *next;
};
Node *head = NULL;
void adauga(int x)
{
Node *temp = new Node;
temp->numar = x;
temp->next = head;
head = temp;
}
int 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)
{
int 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: "
cout<<elimina();
return 0;
}