标签:
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。
输入格式说明:
输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、\以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出格式说明:
输出前缀表达式的运算结果,精确到小数点后1位,或错误信息“ERROR”。
样例输入与输出:
序号 | 输入 | 输出 |
1 |
+ + 2 * 3 - 7 4 / 8 4
|
13.0
|
2 |
/ -25 + * - 2 3 4 / 8 4
|
12.5
|
3 |
/ 5 + * - 2 3 4 / 8 2
|
ERROR
|
4 |
+10.23
|
10.2
|
1 /* 2 ** 求前缀表达式的值 3 */ 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <string.h> 7 #include <ctype.h> 8 9 #define N 30 10 #define TRUE 1 11 #define FALSE 0 12 13 typedef struct { 14 double data[N]; 15 int top; 16 } Stack; 17 18 /* 19 ** 入栈 20 */ 21 void Push( Stack *ptrs, double item ) 22 { 23 if( ptrs->top == N - 1 ){ 24 printf( "Stack is full.\n" ); 25 return; 26 } else { 27 ptrs->data[ ++( ptrs->top ) ] = item; 28 return; 29 } 30 } 31 32 /* 33 ** 岀栈 34 */ 35 double Pop( Stack * ptrs ) 36 { 37 if( ptrs->top == -1 ) { 38 printf( "Stack is empty.\n" ); 39 return; 40 } else 41 return ptrs->data[ ( ptrs->top )-- ]; 42 } 43 44 /* 45 ** 判断是否操作符 46 */ 47 int IsOperator( char ch ) 48 { 49 if( ch == ‘+‘ || ch == ‘-‘ || ch == ‘*‘ || ch == ‘/‘ ) 50 return TRUE; 51 else 52 return FALSE; 53 } 54 55 /* 56 ** 计算 57 */ 58 double Calculate( double a, double b,char ch ) 59 { 60 switch( ch ) { 61 case ‘+‘ : return a + b; break; 62 case ‘-‘ : return a - b; break; 63 case ‘*‘ : return a * b; break; 64 case ‘/‘ : return a / b; 65 } 66 } 67 68 int main() 69 { 70 char expr[N]; 71 gets( expr ); 72 int len = strlen( expr ); 73 74 Stack ss; 75 76 ss.top = -1; 77 78 double cc = 1; 79 double tem_sum = 0; 80 double operand_a; 81 double operand_b; 82 double result; 83 int error = 0; // 记录除数为0的错误情况 84 int i; 85 for( i = len - 1; i >= 0; -- i ) { 86 if( expr[i] >= ‘0‘ && expr[i] <= ‘9‘ ) { 87 tem_sum += ( expr[i] - ‘0‘ ) * cc; 88 cc *= 10; 89 if( expr[i-1] == ‘+‘ ) { 90 //printf( "%d\n", tem_sum ); 91 Push( &ss, tem_sum ); 92 tem_sum = 0; 93 cc = 1; 94 i -= 2; // 跳过下一个正号和空格 95 continue; 96 } else if( expr[i-1] == ‘-‘ ) { 97 tem_sum = -tem_sum; 98 //printf( "%d\n", tem_sum ); 99 Push( &ss, tem_sum ); 100 tem_sum = 0; 101 i -= 2; // 跳过下一个负号和空格 102 continue; 103 } else if( expr[i-1] == ‘ ‘ ) { // 一个数字处理完了 104 //printf( "%d\n", tem_sum ); 105 Push( &ss, tem_sum ); 106 tem_sum = 0; 107 cc = 1; 108 i --; 109 continue; 110 } 111 } else if( expr[i] == ‘.‘ ) { 112 tem_sum /= cc * 1.0; 113 cc = 1; 114 } else if( IsOperator( expr[i] ) ) { 115 operand_a = Pop( &ss ); 116 operand_b = Pop( &ss ); 117 if( expr[i] == ‘/‘ && operand_b == 0 ) { 118 error = 1; 119 break; 120 } else { 121 result = Calculate( operand_a, operand_b, expr[i] ); 122 //printf( "result:%.1lf\n", result ); 123 Push( &ss, result ); 124 i--; // 跳过下一个空格 125 } 126 } 127 } 128 if( error != 1 ) 129 printf( "%.1lf\n", Pop( &ss ) ); 130 else 131 printf( "ERROR\n" ); 132 133 return 0; 134 }
标签:
原文地址:http://www.cnblogs.com/zouhongmey/p/4280705.html