zoukankan      html  css  js  c++  java
  • 表达式求值问题包括“+  × / ( )"-->链表法

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define  error 0
    #define  ok   1
    #define  overflow  -1
    #define STACK_INIT_SIZE  100
    #define STACKINCREMENT 10
    #define OPSETSIZE  7
    char OPSET[7]={'+','-','*','/','(',')','#'};
    unsigned char Prior[7][7] = {     //  算符间的优先关系
       '>','>','<','<','<','>','>',
       '>','>','<','<','<','>','>',
       '>','>','>','>','<','>','>',
       '>','>','>','>','<','>','>',
       '<','<','<','<','<','=',' ',
       '>','>','>','>',' ','>','>',
       '<','<','<','<','<',' ','='
    }; 
    typedef int Status;


    template<typename T>
    struct SqStack
    {
     T  *top;
     T  *base;
     int  stacksize;

    };//顺序栈结构模板

    template<typename T1,typename T2>
     Status InitStack(T1 &S)
    {
     S.base=(T2 *)malloc(STACK_INIT_SIZE*sizeof(T2));
     if(!S.base) 
       exit(overflow);
     S.top=S.base;
     S.stacksize=STACK_INIT_SIZE;
     return ok;
    }//初始化栈函数模板

    template <typename T1,typename T2>
    Status Push(T1 &S,T2 e)
    {
     if(S.top-S.base>=S.stacksize)
     {
      S.base=(T2 *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(T2));
      if(!S.base)  exit (overflow);
      S.top=S.base+S.stacksize;
      S.stacksize+=STACKINCREMENT;
     }
     *S.top++=e;
     return ok;
    }//入栈函数模板


    template <typename T1,typename T2>
    Status Pop(T1 &S,T2 &e)
    {
     if(S.top==S.base) return error;
     e=*--S.top;
     return ok;
    }//出栈函数模板


    template <typename T1,typename T2>
    T2 GetTop(T1 S)
    {
     if(S.top==S.base)
      return error;
     else
      return *(S.top-1);

    }//获取栈顶元素模板


    Status In(char Test,char* TestOp) {
       bool Find=false;
       for (int i=0; i< OPSETSIZE; i++) {
          if (Test == TestOp[i])
        Find= true;
       }
       return Find;
    }//判断是否为运算符


    float Operate(float a,unsigned char theta, float b) {
       switch(theta) {
          case '+': return a+b;
          case '-': return a-b;
          case '*': return a*b;
          case '/': return a/b;
          default : return 0;
       }
    }//运算


    int ReturnOpOrd(char op,char* TestOp) {
       int i;
       for(i=0; i<OPSETSIZE; i++) {
          if (op==TestOp[i])
        return i;
       }
       return 0;
    }

    char precede(char Aop, char Bop) {
       return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];
    }//ReturnOpOrd和precede组合,判断运算符优先级

    float EvaluateExpression(){ 
       // 算术表达式求值的算符优先算法。
       // 设OPTR和OPND分别为运算符栈和运算数栈,OPSET为运算符集合。
       SqStack<char>  OPTR;    //运算符栈,字符元素
       SqStack<float> OPND;    //运算数栈,实数元素
       char TempData[20];
       float Data,a,b;
       char theta,c,x,Dr[2];
      
       InitStack<SqStack<char>,char>(OPTR);
       Push(OPTR, '#');
       InitStack<SqStack<float>,float>(OPND);
       strcpy(TempData,"\0");//将TempData置为空
       c=getchar();
       while (c!= '#'||GetTop<SqStack<char>,char>(OPTR)!= '#')
       {
          if (!In(c, OPSET))
       {
            Dr[0]=c;
            Dr[1]='\0';//存放单个数
             strcat(TempData,Dr);//将单个数连到TempData中,形成字符串
             c=getchar();
             if(In(c,OPSET))//如果遇到运算符,则将字符串TempData转换成实数,入栈,并重新置空
       {
                Data=(float)atof(TempData);
                Push(OPND, Data);
                strcpy(TempData,"\0");
             }
          }
       else
       {   // 不是运算符则进栈
             switch (precede(GetTop<SqStack<char>,char>(OPTR), c)) {
                case '<':   // 栈顶元素优先权低
                     Push(OPTR, c); 
                     c=getchar();
                     break;
                case '=':   // 脱括号并接收下一字符
                     Pop(OPTR, x);  
                     c=getchar();
                     break;
                case '>':   // 退栈并将运算结果入栈
                     Pop(OPTR, theta);
                     Pop(OPND, b); 
                     Pop(OPND, a);                     
                     Push(OPND, Operate(a, theta, b));
                     break;
             } // switch
          }
       } // while
       return GetTop<SqStack<float>,float>(OPND);
    } // EvaluateExpression

    void main()
    {
     printf("欢迎使用本基本算数表达式求值系统:\n");
     char a[10];
     while(strcmp(a,"end")!=0)
     {
     printf("________________________________________________\n");
     printf("请输入表达式(end #):\n");
     printf("%.3f\n",EvaluateExpression());
     printf("________________________________________________\n");
     printf("结束操作,请输入“end”,否则的话请输入“start”\n");
     scanf("%s",&a);
     }
    printf("感谢您的使用,欢迎您下次继续使用本系统\n");
    }

  • 相关阅读:
    Java基础之集合框架(Collection接口和List接口)
    Management
    .NET实现多个不同有效时间Session方案思考
    C#操作MySql数据库帮助类(Dapper,T-Sql)
    MVC控制器传递多个实体类集合到视图的方案总结
    高德js API根据出行方式和出现策略由起始点经纬度实现路线规划
    c#QQ邮件编程学习(收发邮件)
    自定义tt文本模板实现MySql指数据库中生成实体类
    Socket客户端
    Socket服务端
  • 原文地址:https://www.cnblogs.com/xiohao/p/3011324.html
Copyright © 2011-2022 走看看