逆波蘭計算器(后綴表達式)


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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM