Калькулятор. Обратная польская нотация.
Вот пост на хабре с помощью которого это написал.
http://habrahabr.ru/post/100869/
#include <iostream>
#include <string>
#include <vector>
#include <math.h>
using namespace std;
int p(char c){ //определяется приоритет знака
if (c=='=')
return 0;
if ((c=='(') || (c==')'))
return 1;
if (((c>='0') && (c<='9')) || (c=='.'))
return 2;
if ((c=='+') || (c=='-'))
return 3;
if ((c=='*') || (c=='/'))
return 4;
if (c=='^')
return 5;
}
long double calk(string s){
vector<long double> b;
string pol, st="=";
int l=s.size();
long double e=1;
bool fl=false;
for (int i=0;i<l;i++){ //записываем выражение в обратной польской нотации
if (p(s[i])==2){
if (fl==false){
pol=pol+' '+s[i];
fl=true;
}
else
pol+=s[i];
}
else
{
fl=false;
if ((s[i]==')') && (st[st.size()-1]=='('))
st.resize(st.size()-1);
else{
if ((p(s[i])>p(st[st.size()-1])) || (s[i]=='('))
st+=s[i];
else{
pol+=st[st.size()-1];
st.resize(st.size()-1);
i--;
}
}
}
}
for (int i=st.size()-1;i>0;i--)
pol+=st[i];
for (int i=0;i<pol.size();i++){ //считаем
switch (pol[i]){
case ' ' :
b.push_back(0);
e=1;
break;
case '.' :
e=10;
break;
case '+' :
b[b.size()-2]=b[b.size()-2]+b[b.size()-1];
b.pop_back();
break;
case '-' :
b[b.size()-2]=b[b.size()-2]-b[b.size()-1];
b.pop_back();
break;
case '*' :
b[b.size()-2]=b[b.size()-2]*b[b.size()-1];
b.pop_back();
break;
case '^' :
b[b.size()-2]=pow(b[b.size()-2],b[b.size()-1]);
b.pop_back();
break;
case '/' :
if (b[b.size()-1]==0){
cout<<"Division by zero";
return 0;
}
b[b.size()-2]=b[b.size()-2]/b[b.size()-1];
b.pop_back();
break;
default :
b[b.size()-1]=b[b.size()-1]*(e==1 ? 10 : 1)+(pol[i]-48)/e;
if (e!=1)
e*=10;
break;
}
}
return b[0];
}
int main(){
string s;
while (1){
cin>>s;
cout<<calk(s)<<"\n";
}
return 0;
}
Комментарии:
Нету комментариев для вывода...