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


    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 }
  • 相关阅读:
    HOT: AgentFramework 即将发布
    关于配置 Apache + SVN 1.5 + SSL
    LINQ to SQL(LINQ2SQL) vs. ADO.NET Entity Framework(ADOEF)ccBoy版 阅读笔记
    关于导出属性
    linq to sql 与linq to entities的选择
    linq to sql 算ORM吗?
    匿名方法实现(转)
    Aop中动态横切与静态横切
    老张的灵魂——敏捷回顾
    忙于webmis中
  • 原文地址:https://www.cnblogs.com/geziyu/p/9930472.html
Copyright © 2020-2023  润新知