读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
思路:代码参考:https://blog.csdn.net/sinat_26019265/article/details/79284966
#include<iostream>
#include<stack>
#include<cstring>
using namespace std;
stack<char>str;
stack<double>num;
void Calculation(){double a,b;a=num.top() ;num.pop();b=num.top() ;num.pop(); switch(str.top()){case '+': num.push(a+b);break; case '-': num.push(b-a);break;case '*': num.push(a*b);break;case '/': num.push(b/a);break; }str.pop();
}
int est_check(char a){char b=str.top();int l,r;switch(a){case '#': l=0;break;case '(': l=0;break; case ')': l=0;break; case '+': l=1;break;case '-': l=1;break;case '*': l=2;break;case '/': l=2;break; }switch(b){case '#': r=0;break;case '(': r=0;break; case ')': r=0;break; case '+': r=1;break;case '-': r=1;break;case '*': r=2;break;case '/': r=2;break; }if(l>r){str.push(a);return 1; }else if(l==r&&a=='#'){return 1;}else{Calculation(); return 0;}
}
int main(){//输入方式采用scanf()函数,数字+操作符 int n,leng;int number;char ch;str.push('#');//操作符入栈 int f=0;while(~scanf("%d%c",&number,&ch)){//ch用于接收空格 if(f==0&&number==0&&ch=='\n') break;//结束输入 else if(((number==0&&f==1)||number!=0)&&ch=='\n'){num.push(number);//这里好难理解 while(est_check('#')==0); printf("%.2lf\n",num.top());//精确到小数点后2位num.pop(); f=0;}else{f=1;scanf("%c ",&ch);//输入操作符 num.push(number);//数字入栈 while(est_check(ch)==0);//这里好难理解 }}
}
/*Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output
3.00
13.36*/