Pagini recente » Cod sursa (job #605229) | Cod sursa (job #1053186) | Cod sursa (job #1592744) | Cod sursa (job #1877558) | Cod sursa (job #1747420)
#include <iostream>//Evalueaza o expresie cu semnele -,+,*,/,(,)
#include <fstream>
#include <stack>
#include <string>
using namespace std;
/* Exemple
(1+1)*13+10/2
*/
ifstream f("evaluare.in");
ofstream g("evaluare.out");
int applyOperator(int a, int b, char c)
{
//Daca c este + atunci return a + b
switch(c)
{
case '+':
return a+b;
break;
case '-':
return a-b;
break;
case '*':
return a*b;
break;
default:
return a/b;
}
}
bool isOperator(char c)
{
if(c=='+' || c=='-' || c=='*' || c=='/') return true;
return false;
}
bool arePrioritate(char a, char b)
{
//Are prioritate mai mare sau egala ultimul din stack (a) decat cel curent (b)
if(a=='+' || a=='-')
if(b=='+' || b=='-') return true;
if(a=='*' || a=='/') return true;
return false;
}
void Calcul(string s)
{
//Calculam expresia din postfix in rezultatul final
stack<int> st2;
int numar = 0;
cout<<s<<endl;
for(int i=0; i < s.size(); i++)
{
if(isdigit(s[i]))
{
numar = numar*10 + (s[i] - '0');
}
if(s[i]==' ')
{
//Daca in expresie e numar , il adaugam in stiva
//Dupa fiecare numar avem spatiu
st2.push(numar);
numar = 0;
}
if(isOperator(s[i]))
{
//Scoatem ultimele 2 din stiva si aplicam operator, apoi adaugam rezultatul
int temp2 = st2.top();
st2.pop();
int temp1 = st2.top();
st2.pop();
st2.push(applyOperator(temp1,temp2,s[i]));
}
}
cout<<st2.top();
}
void RPN(string s)
{
//Convertim din infix in postfix
stack<char> st;
string res;//Rezultatul
string numar;
for(int i = 0; i < s.size(); i++)
{
if(isdigit(s[i]))
{
numar += s[i];
}
else
{
//Dam de operator -> am avut un numar inainte
if(numar != "") res += numar + " ";
numar = "";
if(isOperator(s[i]))
{
//Cand are prioritate mai mare se adauga
while( !st.empty() && arePrioritate(st.top(),s[i]) && st.top()!='(')
{
res += st.top() ;
st.pop();
}
st.push(s[i]);
}
//In caz de paranteze
if(s[i]=='(') st.push(s[i]);
if(s[i]==')')
{
while(!st.empty() && st.top()!='(')
{
res += st.top();
st.pop();
}
st.pop();
}
}
}
//Ramane intotdeauna ceva in stiva
res += numar + " ";
while( !st.empty() )
{
res += st.top() ;
st.pop();
}
//Etapa finala
Calcul(res);
}
int main()
{
string s;
getline(f,s);
RPN(s);
}