逆波兰计算器(后缀表达式)

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 }

 

posted @ 2018-11-08 17:31  无心小男  阅读(1893)  评论(0编辑  收藏  举报