(图源:gw老师的ppt)
注:要求输入不带空格,如果带空格的话就预处理一下
#include <iostream>
using namespace std;
double getTerm();
double getYinzi();
double getExpression();
double getExpression(){
double rt = getTerm();
while(cin.peek() == '+' || cin.peek() == '-'){
char o = cin.get();
if(o == '+') rt += getTerm();
if(o == '-') rt -= getTerm();
}
return rt;
}
double getTerm(){
double rt = getYinzi();
while(cin.peek() == '*' || cin.peek() == '/'){
char o = cin.get();
if(o == '*') rt *= getYinzi();
if(o == '/') rt /= getYinzi();
}
return rt;
}
double getYinzi(){
bool isMinus = 0;
if(cin.peek() == '-'){
cin.get();
isMinus = 1;
}
else if(cin.peek() == '+') cin.get();
double rt = 0;
if(cin.peek() == '('){
while(cin.peek() == '(') cin.get();
rt = getExpression();
while(cin.peek() == ')') cin.get();
rt = isMinus ? -rt : rt;
}
else{
while(isdigit(cin.peek())){
rt *= 10;
rt += cin.get() - '0';
}
if(cin.peek() == '.'){
cin.get();
double small = 0;
int d = 0;
while(isdigit(cin.peek())){
++d;
small += pow(0.1, d) * (cin.get() - '0');
}
rt += small;
}
rt = isMinus ? -rt : rt;
}
return rt;
}
int main(){
printf("%.2f\n", getExpression());
system("pause");
return 0;
}