nyoj.35 表达式求值【数据结构】 2015/03/11

前端之家收集整理的这篇文章主要介绍了nyoj.35 表达式求值【数据结构】 2015/03/11前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

表达式求值

时间限制: 3000ms | 内存限制: 65535KB
难度: 4
描述
ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。
比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)
输入
第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0
输出
每组都输出该组运算式的运算结果,输出结果保留两位小数。
样例输入
  1. 2
  2. 1.000+2/4=
  3. ((1+2)*5+1)/4=
样例输出
  1. 1.50
  2. 4.00
  1.  
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<stdlib.h>
  5. /*
  6. 利用栈和队列操作,栈储存运算符,队列可以得到最后的后缀表达式,转换后再次用栈进行计算,最后求得结果 
  7. */
  8. int compare( char ch ){
  9. 	if( ch == '(' ) 
  10. 		return 0;
  11. 	if( ch == '+' )
  12. 		return 1;
  13. 	if( ch == '-' )
  14. 		return 1;
  15. 	if( ch == '*' )
  16. 		return 2;
  17. 	if( ch == '/' )
  18. 		return 2;
  19. }
  20. int searchD( char sh[] ){
  21. 	int l = strlen(sh);
  22. 	int i;
  23. 	for( i = 0 ; i < l ; ++i )
  24. 		if( sh[i] == '.')
  25. 			return i;
  26. 	return l;
  27. }
  28. int main(){
  29. 	int n,i,j,l,opr_i,opr_j,isnum,exp_i,res_i;
  30. 	char s[1010];
  31. 	char opr[1010][10];
  32. 	char exp[1010][2];
  33. 	char temp[10];
  34. 	double res[1010],dd;
  35. 	scanf("%d",&n);
  36. 	while(n--){
  37. 		scanf("%s",s);
  38. 		memset(opr,'\0',sizeof(opr));
  39. 		memset(exp,sizeof(exp));
  40. 		memset(res,sizeof(res));
  41. 		i = opr_i = opr_j = exp_i = res_i = 0;
  42. 		while( s[i] != '=' ){
  43. 			j = isnum = 0;
  44. 			while( (s[i]>='0' && s[i]<='9') || s[i]=='.' ){
  45. 				isnum = 1;
  46. 				temp[j++] = s[i++];
  47. 			}
  48. 			if( isnum ){
  49. 				temp[j] = '\0';
  50. 				strcpy( opr[opr_i++],temp );
  51. 			}
  52. 			else{
  53. 				temp[0] = s[i++];
  54. 				temp[1] = '\0';
  55. 				switch( temp[0] ){
  56. 					case '(':strcpy( exp[exp_i++],temp );break;
  57. 					case '+':
  58. 					case '-':
  59. 					case '*':
  60. 					case '/':if( exp_i != 0 )
  61. 								while( compare(temp[0]) <= compare(exp[exp_i-1][0]) ){
  62. 									strcpy( opr[opr_i++],exp[--exp_i] );
  63. 									if( exp_i == 0 ) break;
  64. 								}
  65. 								strcpy( exp[exp_i++],temp );break;
  66. 					case ')':while( exp[exp_i-1][0] != '(' ){
  67. 								strcpy( opr[opr_i++],exp[--exp_i] );
  68. 							}
  69. 							--exp_i;break;
  70. 				}
  71. 			}
  72. 		}
  73. 		while( exp_i >= 0 )
  74. 			strcpy( opr[opr_i++],exp[--exp_i] );
  75. 		
  76. 		for( ; opr_j <= opr_i ; ++opr_j ){
  77. 			if( opr[opr_j][0] >= '0' && opr[opr_j][0] <= '9' ){
  78. 				dd = 0;
  79. 				int x = 1,z,d ;
  80. 				double y = 0.1;
  81. 				d = z = searchD( opr[opr_j] );
  82. 				--d;++z;
  83. 				while( d >= 0 ){
  84. 					dd += ( ( opr[opr_j][d] - '0' ) * x );
  85. 					x*=10;
  86. 					--d;
  87. 				}
  88. 				while( opr[opr_j][z] != '\0' ){
  89. 					dd += ( ( opr[opr_j][z] - '0' ) * y );
  90. 					y*=0.1;
  91. 					++z;
  92. 				}
  93. 				res[res_i++] = dd;
  94. 			}
  95. 			else{
  96. 				switch( opr[opr_j][0] ){
  97. 					case '+':res[res_i-2] += res[res_i-1];break;
  98. 					case '-':res[res_i-2] -= res[res_i-1];break;
  99. 					case '*':res[res_i-2] *= res[res_i-1];break;
  100. 					case '/':res[res_i-2] /= res[res_i-1];break;
  101. 				}
  102. 				res_i--;
  103. 			}
  104. 		}
  105. 		printf("%.2lf\n",res[0]);
  106. 	}
  107. 	return 0;
  108. }        

猜你在找的数据结构相关文章