题目描述:
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
1 + 2 4 + 2 * 5 - 7 / 11 0
3.00 13.36
这道题目,我一开始就是想到用栈,数据结构中栈的应用,然后就 Wa 了,想的太复杂了,直接从头到尾,用队列就可以了。
例如这组数据:4 * 2 * 1 * 1 * 1 / 1 / 1 / 1 - 1 + 1 + 1 + 1 / 1 / 1 / 4 / 2 + 5,正确答案应该是 14.12,用两个栈的会算成 16.12。有点坑,因为 -1 + 1 在这里,应该先算 -1 再算 +1 , 如果用栈,很容易算成 - ( 1 + 1 ) 。
直接用一个数组保存当前的加减项,就是只保存 + 和 - 的数字,如果有 * / 都先计算成 可以+ - 的数,最后统一加起来就好了。
#include <bits/stdc++.h>
using namespace std ;
double package[205] ;
int main(){
// freopen( "Hdu 1237.txt" , "r" , stdin ) ;
int first , num , top ;
char oper ;
while( ~scanf( "%d" , &first ) ){ // 默认开头是数字
char ch = getchar() ;
if( first == 0 && ch == '\n' ) // 结束输入
break ;
memset( package , 0 , sizeof( package ) ) ;
top = 0 ;
package[++top] = first ;
while( ~scanf( "%c %d" , &oper , &num ) ){
if( oper == '+' ) package[++top] = num ;
else if( oper == '-' ) package[++top] = -num ;
else if( oper == '*' ) package[top] *= num ; // * 和 / 操作直接计算好,不算入下一个加减项
else if( oper == '/' ) package[top] /= num ;
if( getchar() == '\n' )
break ;
}
double ans = 0.00 ;
for( int i = 1 ; i <= top ; ++i )
ans += (double)package[i] ;
printf( "%.2lf\n" , ans ) ;
}
return 0 ;
}