题意:
给你一个只有+ - * / 的计算表达式 , 要你求出结果.
坑爹:
一开始我只是以为只要在输入的时候遇到*或者/就弹出来进行计算,然后在到最后计算 + 和 - 的时候直接弹出
一个一个计算,最后才发现原来在最后弹出来计算的时候要全部反过来,不能直接弹出就计算然后压入.
解法:
遇到 * 或者 / 就弹出两个进行计算, 然后压入结果 , 到最后的时候把栈里的数字反过来,也就是用一个数组从0 - n
开始存每一个出栈的数字 , 符号栈也是相同的操作 , 然后就可以进行正常的按顺序这样做 + 和 - 操作了.
View Code
1 #include2 #include 3 using namespace std; 4 5 6 int main() 7 { 8 char ex[300]; 9 while(scanf("%s",ex) != EOF) 10 { 11 double num; 12 char str; 13 stack N; 14 stack C; 15 16 int flag = 0; int len; 17 len = strlen(ex) ; 18 19 for(int y = 0 ; y < len ; y ++) 20 { 21 if(ex[0] != '0') 22 { 23 flag = 1; 24 break; 25 } 26 } 27 if(!flag) 28 { 29 if(getchar() == '\n') 30 { 31 break; 32 } 33 } 34 35 36 37 38 num = ex[ len - 1 ] - 48; 39 40 for( y = len - 2 ; y >= 0 ; y -- ) 41 { 42 double a = ex[y] - 48 ; 43 for(int k = 0 ; k < len - y - 1 ; k++ ) 44 { 45 a *= 10 ; 46 } 47 num += a; 48 } 49 50 N.push(num); 51 52 53 54 for (int i = 1; ; i++ ) 55 { 56 57 cin>>str ; 58 cin>>num ; 59 N.push(num); 60 61 62 63 if(str == '/' ) 64 { 65 double a; 66 double b; 67 a = N.top(); 68 N.pop(); 69 b = N.top(); 70 N.pop(); 71 N.push( b / a ); 72 } 73 74 if(str == '*' ) 75 { 76 double a; 77 double b; 78 a = N.top(); 79 N.pop(); 80 b = N.top(); 81 N.pop(); 82 N.push( b * a ); 83 } 84 85 if(str == '-' || str == '+') 86 { 87 C.push(str); 88 } 89 90 91 92 if( getchar() == '\n') 93 { 94 break; 95 } 96 } 97 98 if(C.size() != 0) 99 {100 double st[300];101 char sd[300];102 int count;103 for(i = 0 ; N.size() != 0 ; i ++)104 {105 st[i] = N.top();106 N.pop();107 }108 for(i = 0 ; C.size() != 0 ; i++ )109 {110 sd[i] = C.top();111 C.pop();112 }113 sd[i] = '\0' ;114 115 int len1;116 len1 = strlen(sd);117 char *p = sd + len1 - 1;118 119 for(i = len1 ; i >0 ; i -- )120 {121 if(*p == '+' )122 {123 st[i-1] = st[i-1] + st[i];124 }125 if(*p == '-' )126 {127 st[i -1 ] = st[i] - st[i-1];128 }129 p--;130 }131 132 printf("%.2lf\n",st[0]); 133 }134 else135 {136 printf("%.2lf\n",N.top());137 }138 139 }140 return 0;141 }