[C++] 表达式转换 →→→→→进入此内容的聊天室

来自 , 2019-12-23, 写在 C++, 查看 106 次.
URL http://www.code666.cn/view/253614bb
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. void cspace(int &f)//输出
  4. {
  5.     if(f)
  6.     {
  7.         cout<<" ";
  8.         f=0;
  9.     }
  10. }
  11. int zhengfu(char c)//判断是否是+、-号
  12. {
  13.     if(c=='+'||c=='-')
  14.         return 1;
  15.     return 0;
  16. }
  17. int num(char c)//判断是否是数字或小数点
  18. {
  19.     if((c>='0'&&c<='9')||c=='.')
  20.         return 1;
  21.     return 0;
  22. }
  23. int youxian(char a,char b)//符号优先级
  24. {
  25.     if(b==')')
  26.         return 1;
  27.     if(a=='('||b=='(')
  28.             return 0;
  29.     switch(b)
  30.     {
  31.     case '+':
  32.     case '-':
  33.         return 1;
  34.     case '*':
  35.     case '/':
  36.         switch(a)
  37.         {
  38.         case '*':
  39.         case '/':
  40.             return 1;
  41.         case'+':
  42.         case'-':
  43.             return 0;
  44.         }
  45.     }
  46. }
  47. int main()
  48. {
  49.     char a[21],s[21];
  50.     cin>>a;
  51.     int length=strlen(a),m=0,flag=0;//m是栈的下标,flag记录空格
  52.     for(int i=0; i<length; i++)
  53.     {
  54.         if(zhengfu(a[i])&&!num(a[i-1])&&a[i-1]!=')')
  55.         {
  56.             if(a[i]=='-')//正号不输出
  57.             {
  58.                 cspace(flag);
  59.                 cout<<"-";
  60.             }
  61.         }
  62.         else if(num(a[i]))//数字直接输出
  63.         {
  64.             cspace(flag);
  65.             cout<<a[i];
  66.         }
  67.         else
  68.         {
  69.             if(m)
  70.             {
  71.                 if(a[i]==')')
  72.                     while(m--)
  73.                     {
  74.                         if(s[m]=='(')
  75.                             break;
  76.                         cout<<" "<<s[m];
  77.                     }
  78.                 else
  79.                 {
  80.                     while(m)
  81.                     {
  82.                         if(youxian(s[m-1],a[i]))
  83.                             cout<<" "<<s[--m];
  84.                         else break;
  85.                     }
  86.                     s[m++]=a[i];
  87.                 }
  88.             }
  89.             else s[m++]=a[i];
  90.             for(int j=0; j<m; j++)
  91.                 if(s[j]!='(')
  92.                 {
  93.                     flag=1;
  94.                     break;
  95.                 }
  96.         }
  97.     }
  98.     while(m--)
  99.         cout<<" "<<s[m];
  100.     return 0;
  101. }

回复 "表达式转换"

这儿你可以回复上面这条便签

captcha