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("\n假設用逆波蘭表達式計算:(1-2)*(4+5)= ? ---- 運算結果應為-9.000000\n"); 52 sqStack s; 53 InitStack(s); 54 char c; 55 double d,e;//支持小數數據的運算,定義成double類型 56 char str[10]; 57 int i = 0; 58 printf("\n\n請按逆波蘭表達式輸入待計算的數據,數據與運算符之間用空格隔開,以‘#’作為結束標志\n"); 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("出錯:輸入的單個數據過大!\n"); 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("\n錯誤:除數不為零!"); 99 return -1; 100 } 101 break ; 102 } 103 scanf("%c",&c); 104 } 105 106 Pop(s,d);//最后一個元素出棧就是最終的運算結果 107 printf("\n最終的運算結果為:%f",d); 108 return 0; 109 }