中缀表达式求值

来源:互联网 发布:freebsd 源码 编辑:程序博客网 时间:2024/06/11 06:38
  1. #include <iostream>
  2. #define MAXSIZE 100                   //可以用中缀表达式求值
  3. using namespace std;                   //计算整数范围的表达式的值,值的范围不局限于0到79
  4. typedef  struct
  5. {
  6.     char *base;     //栈低指针
  7.     char *top;          //栈顶指针
  8.     int stacksize;      //栈的大小
  9. }SqStack;
  10. void InitStock(SqStack &S)      //构造空栈
  11. {
  12.     S.base=new char[MAXSIZE];
  13.     if(!(S.base))
  14.         cout<<"存储分配失败"<<endl;
  15.     S.top=S.base;
  16.     S.stacksize=MAXSIZE;
  17. }
  18. char  GetTop(SqStack S)          //返回S的栈顶元素
  19. {
  20.     if((S.top)!=S.base)
  21.         return *(S.top-1);
  22.         return 0;
  23. }
  24. void Push(SqStack &S,char e)        //插入e为新的栈顶元素
  25. {
  26.     if((S.top-S.base)==S.stacksize)
  27.       {
  28.           cout<<"栈已满"<<endl;
  29.       }
  30.     else
  31.     {
  32.         *(S.top)=e;


  33.         S.top++;
  34.     }
  35. }
  36. void Pop(SqStack &S,char &e)        //将栈顶元素弹出
  37. {
  38.     if(S.top==S.base)
  39.         cout<<"栈空"<<endl;
  40.     else
  41.     {
  42.         e=*(S.top-1);
  43.         S.top--;
  44.     }
  45. }
  46. int  In(char  d)//判断是否为运算符,是则返回1
  47. {
  48.      switch(d)
  49.      {
  50.      case '(':
  51.      case ')':
  52.      case  '+':
  53.      case  '-':
  54.      case '*':
  55.      case '/':
  56.      case '=':
  57.         return  1;
  58.      default :
  59.         return 0;
  60.      }
  61. }
  62. char Precede(char f,char g) //比较两个运算符的优先级
  63. {
  64.     if((f=='+'||f=='-')&&(g=='+'||g=='-'))
  65.         return '>';
  66.     if((f=='+'||f=='-')&&(g=='*'||g=='/'))
  67.         return '<';
  68.     if((f=='*'||f=='/')&&(g=='+'||g=='-'))
  69.         return '>';
  70.     if((f=='*'||f=='/')&&(g=='*'||g=='/'))
  71.         return '>';
  72.    if((f=='(')&&(g=='+'||g=='-'||g=='*'||g=='/'))
  73.         return '<';
  74.     if((f=='+'||f=='-'||f=='*'||f=='/')&&(g=='('))
  75.         return '<';
  76.     if((f=='+'||f=='-'||f=='*'||f=='/')&&(g==')'))
  77.         return '>';
  78.     if(f=='=')
  79.         return '<';
  80.     if((f=='+'||f=='-'||f=='*'||f=='/')&&(g=='='))
  81.         return '>';
  82.     if((f=='('&&g==')'))
  83.       return '=';
  84.     return 0;
  85. }
  86. int ads(int a,char th,int b)//计算两个数关于算符th的值
  87. {
  88.     switch(th)
  89.     {
  90.         case '+':
  91.             return a+b;
  92.             break;
  93.         case '-':
  94.             return a-b;
  95.             break;
  96.         case  '*':
  97.             return a*b;
  98.             break;
  99.         case '/':
  100.             return a/b;
  101.     }
  102.     return 0;
  103. }
  104.  int  charint(SqStack &OPND,char a)//多个字符数字转换成一个整数
  105. {
  106.     int *q=new int[MAXSIZE];
  107.     int i,k,g=0;
  108.     for(i=0;i<=MAXSIZE&&GetTop(OPND)!='#';i++)
  109.         {
  110.             Pop(OPND,a);
  111.             q[i]=a-48;
  112.         }
  113.     for(k=i-1;k>=0;k--)
  114.     {
  115.         int er=1;
  116.         for(int z=k;z>0;z--)//计算10的z次方
  117.            er*=10;
  118.          g=g+q[k]*er;
  119.     }
  120.         delete[] q;
  121.         return g;
  122. }
  123.  void intchar(SqStack &OPND,int j)//将一个整数转换成多个字符
  124. {
  125.     int i,k;
  126.     char *a=new char[MAXSIZE];
  127.     a[0]=j%10+48;                                    //将整数j的个位数赋给a[0]
  128.     for(i=1;i<MAXSIZE&&j>=10;i++) //将j的其他的位数分别赋给数组a[i];如十位赋给a[1],百位赋给a[2],
  129.         {                                                        //依次类推
  130.              j/=10;
  131.             a[i]=j%10+48;
  132.         }
  133.     for(k=i-1;k>=0;k--)                        //将各个位的字符分别压入栈中
  134.       {
  135.          Push(OPND, a[k] );
  136.       }
  137.         Push(OPND,'#');                        //'#'作为整数j的结尾,以便将字符串的j转换成整数
  138.         delete[] a;
  139. }
  140. int    value(char  *Q)                        //求表达式的值得函数
  141. {
  142.     char  *t=Q;
  143.     SqStack  OPND,OPTR;             //OPND为操作数栈,OPTR为运算符栈
  144.     InitStock(OPND);                     //初始化栈
  145.     InitStock(OPTR);                     //初始化栈
  146.     Push(OPTR,'=');                      //作为判断开始运算符优先级的比较和读取表达式结束的标志
  147.     Push(OPND,'#');                     //作为判断一个整数存储的位置
  148.     while( (*t)!='='||GetTop(OPTR)!='=')        //读取表达式结束的条件
  149.     {
  150.         if(!In(*t))                               //判断是否压入'#'的条件
  151.         {
  152.              while(!In(*t))                  //*t是否为算符,不是则压入操作数栈
  153.             {
  154.                 Push(OPND,*t);
  155.                 t++;
  156.             }
  157.                 Push(OPND,'#');
  158.         }
  159.         switch(Precede(GetTop(OPTR),*t))   //Precede(char ,char)函数是比较两个算符的运算优先级
  160.         {
  161.         case '<':
  162.             Push(OPTR,*t);
  163.             t++;
  164.             break;
  165.         case '>':
  166.             int j,a1,b1;
  167.             char  th,a,b;
  168.             Pop(OPTR,th);
  169.             Pop(OPND,b);
  170.             b1=charint(OPND,b);//多位数字字符转为整数
  171.             Pop(OPND,a);
  172.             a1=charint(OPND,a);//多位数字字符转为整数
  173.             if(th=='/'&&b1==0)
  174.             {
  175.                 cout<<"除数不能为零!"<<endl;
  176.                 return 0;
  177.             }
  178.             else
  179.              {
  180.                   j=ads(a1,th,b1);
  181.                   intchar(OPND,j);//整数转换成字符
  182.              }
  183.             break;
  184.         case  '=' :
  185.             char e;
  186.             Pop(OPTR, e);
  187.             t++;
  188.             break;
  189.         }
  190.      }
  191.     char s;
  192.     Pop(OPND,s);
  193.    cout<<charint(OPND,s)<<endl;         //输出计算结果
  194.     delete[] OPND.base;
  195.     delete[] OPTR.base;
  196.     return 0;
  197. }
  198. int main()
  199. {
  200.     cout<<"请输入一个表达式:(如:2*123+56-41+(5*45+96/3-9)*12=)"<<endl;
  201.     char  *s=new char[45];
  202.     cin>>s;
  203.     value(s);
  204.     delete s;
  205.     return 0;
  206. }
原创粉丝点击