codeup- 简单计算器

Problem A: 简单计算器

Time Limit: 1 Sec  Memory Limit: 32 MB
Submit: 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\n", temp);
91     }
92     return 0;
93 }

注意:

1、对最后一个操作数的处理,一定别忘记将其入栈。

2、操作符优先级的比较逻辑,分清四种情况

3、当所有元素已经入栈完,此时符号栈不空,操作数栈的元素一定是>=2个的。保证进行最后一次操作时,操作数栈的元素只有2个,且操作结果无需再次入栈。

猜你喜欢

转载自www.cnblogs.com/heyour/p/12162395.html
今日推荐