1、实现对逆波兰输入的表达式进行计算
2、支持带小数点的数据
1 //逆波兰计算器(后缀表达式) 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<math.h> 5 #include<ctype.h>//isdigit(c)函数的头文件,用于判断传入的字符c是否为"0-9"的数字字符 6 7 #define STACK_INIT_SIZE 20 //栈的初始空间大小 8 #define STACKINCREMENT 10 //增量,用于追加额外空间 9 10 typedef double ElemType; 11 12 typedef struct{ 13 ElemType *base;//栈底指针 14 ElemType *top;//栈顶指针 15 int stackSize; 16 }sqStack; 17 18 //初始化栈 19 void InitStack(sqStack &s){ 20 s.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); 21 if( !s.base ) 22 exit(0); 23 s.top = s.base; 24 s.stackSize = STACK_INIT_SIZE; 25 } 26 27 //元素入栈 28 void Push(sqStack &s, ElemType e){ 29 if( s.top-s.base >= s.stackSize ){ 30 s.base = (ElemType *)realloc(s.base, (s.stackSize+STACKINCREMENT)*sizeof(ElemType)); 31 if( !s.base ) 32 exit(0); 33 } 34 *s.top = e; 35 s.top++; 36 } 37 38 //元素出栈 39 void Pop(sqStack &s, ElemType &e){ 40 if( s.top == s.base ) 41 return ; 42 e = *--s.top; 43 } 44 45 //返回栈的当前容量 46 int StackLen(sqStack s){ 47 return (s.top-s.base); 48 } 49 50 int main(){ 51 printf(" 假设用逆波兰表达式计算:(1-2)*(4+5)= ? ---- 运算结果应为-9.000000 "); 52 sqStack s; 53 InitStack(s); 54 char c; 55 double d,e;//支持小数数据的运算,定义成double类型 56 char str[10]; 57 int i = 0; 58 printf(" 请按逆波兰表达式输入待计算的数据,数据与运算符之间用空格隔开,以‘#’作为结束标志 "); 59 scanf("%c",&c); 60 while( c != '#' ){ 61 while( isdigit( c ) || c == '.' ){//数据缓冲区,isdigit()检查参数c是否为阿拉伯数字0到9(字符数字) 62 str[i++] = c;//如果是数字 字符,将字符存放数组里 63 if( i >= 10){//规定每个数字的位数小于10 64 printf("出错:输入的单个数据过大! "); 65 return -1; 66 } 67 scanf("%c",&c); 68 if(c == ' '){//如果输入空格,表示一个数据输入结束,将数据元素入栈 69 d = atof(str);//用于将字符串转换为双精度浮点数(double) 70 Push(s,d);//遇到数字就入栈,此时入栈的是double类型的数字,不是字符 71 i = 0; 72 break ;//跳出while循环 73 } 74 } 75 76 switch( c ){ 77 case '+': 78 Pop(s,e); 79 Pop(s,d);//弹出栈顶两个元素 80 Push(s,d+e);//相加 81 break ; 82 case '-': 83 Pop(s,e); 84 Pop(s,d); 85 Push(s,d-e);//相减 86 break ; 87 case '*': 88 Pop(s,e); 89 Pop(s,d); 90 Push(s,d*e);//相乘 91 break ; 92 case '/': 93 Pop(s,e); 94 Pop(s,d); 95 if( e != 0 ) 96 Push(s,d/e);//相除 97 else{ 98 printf(" 错误:除数不为零!"); 99 return -1; 100 } 101 break ; 102 } 103 scanf("%c",&c); 104 } 105 106 Pop(s,d);//最后一个元素出栈就是最终的运算结果 107 printf(" 最终的运算结果为:%f",d); 108 return 0; 109 }