表达式求值

写了大半夜终于写完了 

整理算法如下:

——遇运算对象,直接压入OPND
——遇运算符op,与OPTR 栈顶op'比较。op'   优先级不低于op   时弹出op ',从OPDN   弹出运算对象,计算结果压入OPDN。反复至栈顶运算符优先级低于op   时将运算符op   压入OPTR
——遇左括号,直接进栈OPTR
——遇右括号,逐个弹出运算符,从OPDN  弹出运算对象,计算并将结果压入OPDN,直至把对应左括号弹出
——遇表达式结束,逐个弹出运算符并进行计算,直至处理完全部运算符
——若OPDN 只有一个元素则完成并输出,否则表达式有错。

 

代码

只支持+-*/()操作



 

  1. #include<iostream>
  2. #include<stdlib.h>
  3. using namespace std;
  4. #define OK 1
  5. #define ERROR 0
  6. #define MAXSIZE 50
  7. typedef int Status;
  8. typedef struct
  9. {
  10.     double array[MAXSIZE];
  11.     int top;   
  12.      }Stack_OPND;
  13. typedef struct
  14. {
  15.     char array[MAXSIZE];
  16.     int top;   
  17.      }Stack_OPTR;
  18.      
  19. Status InitStack(Stack_OPND &opnd,Stack_OPTR &optr)
  20. {
  21.        opnd.top=0;
  22.        optr.array[0]='#';
  23.        optr.top=1;
  24.        return OK;}
  25. Status Push_OPND(double a,Stack_OPND &opnd)
  26. {
  27.        if(opnd.top>MAXSIZE) exit(1);
  28.        opnd.array[opnd.top++]=a;
  29.        return OK;}
  30. Status Push_OPTR(char a,Stack_OPTR &optr)
  31. {
  32.        if(optr.top>MAXSIZE) exit(1);
  33.        optr.array[optr.top++]=a;
  34.        return OK;}
  35. double Pop_OPND(Stack_OPND &opnd)
  36. {
  37.      return opnd.array[--opnd.top];}
  38.      
  39. char Pop_OPTR(Stack_OPTR &optr)
  40. {
  41.      return optr.array[--optr.top];}
  42. char Gettop_OPTR(Stack_OPTR optr)
  43. {
  44.      return optr.array[--optr.top];}
  45. char Precede(char a,char b)
  46. {
  47.      switch(a)
  48.      {
  49.         case '+':case '-'
  50.              if(b=='+'||b=='-'
  51.                                 return '=';
  52.              else if(b=='*'||b=='/'
  53.                                 return '<';
  54.         case '*':case '/':
  55.               if(b=='+'||b=='-'
  56.                                  return '>';
  57.              else if(b=='*'||b=='/'
  58.                                  return '='
  59.         case '('return '<'
  60.         case '#'return '<';
  61.         default:
  62.                 exit(1);}
  63.         }
  64. void Caculate(Stack_OPND &opnd,char op)
  65. {
  66.      double a,b;
  67.      a=Pop_OPND(opnd);
  68.      b=Pop_OPND(opnd);
  69.      switch(op)
  70.      {
  71.          case '+':   Push_OPND(a+b,opnd); break;
  72.          case '-':   Push_OPND(a-b,opnd); break;
  73.          case '*':   Push_OPND(a*b,opnd); break;   
  74.          case '/':   Push_OPND(a/b,opnd);    }
  75. }            
  76.              
  77. double EvaluateExpression(char* MyExpression)
  78. {
  79.       Stack_OPTR OPTR;
  80.       Stack_OPND OPND;
  81.       char *p=MyExpression;
  82.       char t[10];
  83.       int i;
  84.       double d;
  85.       char op;
  86.       InitStack(OPND,OPTR);
  87.       while(*p!='/0')
  88.       if(*p>='0'&&*p<='9'
  89.            {
  90.               i=0; 
  91.               t[i]=*p++;
  92.               while(i<9&&*p>='0'&&*p<='9'||*p=='.')
  93.               t[++i]=*p++;
  94.               t[i+1]='/0';
  95.               if(i>9) exit(1);       
  96.               d=atof(t);
  97.               Push_OPND(d,OPND);}
  98.      else if(*p=='+'||*p=='-'||*p=='/'||*p=='*')
  99.                 {  switch(Precede(Gettop_OPTR(OPTR),*p))
  100.                   {
  101.                     case '='case '>':
  102.                          
  103.                              op=Pop_OPTR(OPTR);
  104.                              Caculate(OPND,op);
  105.                              Push_OPTR(*p,OPTR);p++;break;
  106.                     case '<':  
  107.                          Push_OPTR(*p,OPTR);p++;break;
  108.                     }}
  109.      else if(*p=='(')  
  110.                 {
  111.                  Push_OPTR(*p,OPTR);
  112.                  p++;     }
  113.      else if(*p==')'){
  114.           while((op=Pop_OPTR(OPTR))!='(')
  115.           Caculate(OPND,op);
  116.           p++;}
  117.      else if(*p=='='
  118.           {
  119.           while(OPTR.top!=1)
  120.           {
  121.              op=Pop_OPTR(OPTR);
  122.              Caculate(OPND,op);   }
  123.           p++;}
  124.   return OPND.array[0];
  125. }
  126. int main()
  127. {
  128.     char MyExpression[100];
  129.     while(cin>>MyExpression)
  130.     cout<<"The answer is:"<<EvaluateExpression(MyExpression)<<endl;
  131.     return 0;}
  132.                      
  133.      
  134. 1+1=
  135. The answer is:2
  136. (3+4)*2=
  137. The answer is:14
  138. 4*(2+3*4)=
  139. The answer is:56

             

    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值