Problem A: 简单计算器
Time Limit: 1 Sec Memory Limit: 32 MBSubmit: 2115 Solved: 867
[Submit][Status][Web Board][Creator:Imported]
Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
30 / 90 - 26 + 97 - 5 - 6 - 13 / 88 * 6 + 51 / 29 + 79 * 87 + 57 * 92
0
Sample Output
12178.21
具体代码是:
1 #include <iostream> 2 #include <string> 3 #include <stack> 4 using namespace std; 5 6 double comp(double a, double b, char c){ // 进行具体的操作 7 double temp; 8 switch(c){ 9 case '-': 10 temp = a - b; 11 break; 12 case '+': 13 temp = a + b; 14 break; 15 case '/': 16 temp = a / b; 17 break; 18 case '*': 19 temp = a * b; 20 break; 21 } 22 return temp; 23 } 24 25 bool Judge(char c1, char c2){ //比较符号栈栈顶元素与将要入栈的符号之间的优先级 26 bool flag = true; 27 if(c1=='-'&&c2=='/' || c1=='-'&& c2=='*'){ 28 flag = false; 29 }else if(c1=='+'&&c2=='/' || c1=='+'&& c2=='*'){ 30 flag = false; 31 } 32 return flag; 33 } 34 35 int main(){ 36 string s; 37 stack<char> sc; 38 stack<double> sb; 39 while(getline(cin, s)){ 40 if(s.size()==1 && s=="0"){ //仅输入0时,退出程序 41 break; 42 } 43 double temp, a, b; 44 int i=0, len = s.size(); 45 char c; 46 do{ 47 temp = 0; 48 for( ; i<len; i++){ //操作数入栈 49 if(s[i]==' '){ 50 sb.push(temp); 51 break; 52 }else{ 53 temp = temp * 10 + s[i] - '0'; 54 } 55 if(i==len-1){ //注意最后一个操作后无空格,需要特殊处理 56 sb.push(temp); 57 } 58 } 59 if(i != len){ 60 i++; //跳过符号前的空格 61 while(!sc.empty()){ //只要符号栈内有优先级高的操作符,均先出栈处理 62 c = sc.top(); 63 if(Judge(c, s[i])){ 64 //符号栈顶元素需要出栈 65 b = sb.top(); //第二个操作数 66 sb.pop(); 67 a = sb.top(); //第一个操作数 68 sb.pop(); 69 temp = comp(a, b, c); 70 sb.push(temp); 71 sc.pop(); 72 }else{ 73 break; 74 } 75 } 76 sc.push(s[i]);//将当前操作符入栈 77 i = i + 2; //跳过符号后的空格 78 }else{ 79 b = sb.top(); //第二个操作数 80 sb.pop(); 81 a = sb.top(); //第一个操作数 82 sb.pop(); 83 temp = comp(a, b, sc.top()); 84 if(!sc.empty()){ //一定不要忘记,符号栈不空时,操作后的操作数入栈,保证最后一次操作还剩两个操作符 85 sb.push(temp); 86 } 87 sc.pop(); 88 } 89 }while(!sc.empty()); 90 printf("%.2f ", temp); 91 } 92 return 0; 93 }
注意:
1、对最后一个操作数的处理,一定别忘记将其入栈。
2、操作符优先级的比较逻辑,分清四种情况
3、当所有元素已经入栈完,此时符号栈不空,操作数栈的元素一定是>=2个的。保证进行最后一次操作时,操作数栈的元素只有2个,且操作结果无需再次入栈。