[C++] 表达式求值(以@结尾的中缀算术表达式) →→→→→进入此内容的聊天室

来自 , 2020-02-07, 写在 C++, 查看 145 次.
URL http://www.code666.cn/view/faacbcd5
  1. #include<iostream.h>
  2. #include<stdlib.h>
  3. #include<ctype.h>
  4. #include<PROCESS.H>
  5. #include<STRSTREAM.H>
  6. typedef float elemtype;
  7. struct stack
  8. {
  9.         elemtype *stack;
  10.         short top;
  11.         short stackmaxsize;
  12. };
  13.  
  14. static void initstack ( stack &s,int ms )
  15. {
  16.         s.stack=new elemtype[ms];
  17.         if ( !s.stack )
  18.         {
  19.                 cerr<<"memory full!"<<endl;
  20.                 exit ( 1 );
  21.         }
  22.         s.top=-1;
  23.         s.stackmaxsize=ms;
  24. }
  25.  
  26. static void  clearstack ( stack &s )
  27. { s.top=-1;}
  28.  
  29. static void  deletestack ( stack &s )
  30. {
  31.         delete []s.stack;
  32.         s.top=-1;
  33.         s.stackmaxsize=0;
  34. }
  35.  
  36. static int  stackempty ( stack &s )
  37. { return s.top==-1;}
  38.  
  39. static elemtype  peek ( stack &s )
  40. {
  41.         if ( s.top==-1 )
  42.         {
  43.                 cerr<<"stack empty!"<<endl;
  44.                 exit ( 1 );
  45.         }
  46.         return s.stack[s.top];
  47. }
  48.  
  49. static void push ( stack &s,elemtype itim )
  50. {
  51.         if ( s.top==s.stackmaxsize-1 )
  52.         {
  53.                 cerr<<"stack ovflw!"<<endl;
  54.                 exit ( 1 );
  55.         }
  56.         s.top++;
  57.         s.stack[s.top]=itim;
  58. }
  59.  
  60. static elemtype pop ( stack &s )
  61. {
  62.         if ( s.top==-1 )
  63.         {
  64.                 cerr<<"stack empty!"<<endl;
  65.                 exit ( 1 );
  66.         }
  67.         s.top--;
  68.         return s.stack[s.top+1];
  69. }
  70.  
  71. static int stackfull ( stack &s )
  72. {
  73.         return s.top==s.stackmaxsize-1;
  74. }
  75.  
  76. int precedence ( char op )
  77. {
  78.         switch ( op )
  79.         {
  80.         case'+':
  81.         case'-':
  82.                 return 1;
  83.         case'*':
  84.         case'/':
  85.                 return 2;
  86.         case'(':
  87.         case'@':
  88.         default:
  89.                 return 0;
  90.         }
  91. }
  92.  
  93.  
  94. static float compute ( char *str )
  95. {
  96.         typedef float elemtype;
  97.         int sm=20;
  98.         stack s;
  99.         initstack ( s,sm );
  100.         istrstream ins ( str );
  101.         char ch;
  102.         float x;
  103.         ins>>ch;
  104.         while ( ch!='@' )
  105.         {
  106.                 switch ( ch )
  107.                 {
  108.                 case'+':
  109.                         x=pop ( s ) +pop ( s );
  110.                         break;
  111.                 case'-':
  112.                         x=pop ( s );
  113.                         x=pop ( s )-x;
  114.                         break;
  115.                 case'*':
  116.                         x=pop ( s ) *pop ( s );
  117.                         break;
  118.                 case'/':
  119.                         x=pop ( s );
  120.                         if ( x!=0 )
  121.                                 x=pop ( s ) /x;
  122.                         else
  123.                         {
  124.                                 cerr<<"divide by 0!"<<endl;
  125.                                 exit ( 1 );
  126.                         }
  127.                         break;
  128.                 default:
  129.                         ins.putback ( ch );
  130.                         ins>>x;
  131.                 }
  132.                 push ( s,x );
  133.                 ins>>ch;
  134.         }
  135. //       x=pop(s);
  136. //       return x;
  137.         if ( !stackempty ( s ) )
  138.         {
  139.                 x=pop ( s );
  140.                 if ( !stackempty ( s ) )
  141.                 {
  142.                         cerr<<"expression error!"<<endl;
  143.                         exit ( 1 );
  144.                 }
  145.         }
  146.         else
  147.         {
  148.                 cerr<<"stack is empty!"<<endl;
  149.                 exit ( 1 );
  150.         }
  151.         return x;
  152. }
  153.  
  154. static void change ( char *s1,char  *s2 )
  155. {
  156.         typedef char elemtype;
  157.         int ms=20;
  158.         stack r;
  159.         initstack ( r,ms );
  160.         push ( r,'@' );
  161.         int i,j;
  162.         i=0;
  163.         j=0;
  164.         char ch=s1[i];
  165.         while ( ch!='@' )
  166.         {
  167.                 if ( ch==' ' )
  168.                         ch=s1[++i];
  169.                 else if ( ch=='(' )
  170.                 {
  171.                         push ( r,ch );
  172.                         ch=s1[++i];
  173.                 }
  174.                 else if ( ch==')' )
  175.                 {
  176.                         while ( peek ( r ) !='(' )
  177.                                 s2[j++]=pop ( r );
  178.                         pop ( r );
  179.                         ch=s1[++i];
  180.                 }
  181.                 else if ( ch=='+'||ch=='-'||ch=='*'||ch=='/' )
  182.                 {
  183.                         char w=peek ( r );
  184.                         while ( precedence ( w ) >=precedence ( ch ) )
  185.                         {
  186.                                 s2[j++]=w;
  187.                                 pop ( r );
  188.                                 w=peek ( r );
  189.                         }
  190.                         push ( r,ch );
  191.                         ch=s1[++i];
  192.                 }
  193.                 else
  194.                 {
  195.                         while ( isdigit ( ch ) ||ch=='.' )
  196.                         {
  197.                                 s2[j++]=ch;
  198.                                 ch=s1[++i];
  199.                         }
  200.                         s2[j++]=' ';
  201.                 }
  202.         }
  203.         ch=pop ( r );
  204.         while ( ch!='@' )
  205.         {
  206.                 if ( ch=='(' )
  207.                 {
  208.                         cerr<<"expression error!"<<endl;
  209.                         exit ( 1 );
  210.                 }
  211.                 else
  212.                 {
  213.                         s2[j++]=ch;
  214.                         ch=pop ( r );
  215.                 }
  216.         }
  217.         s2[j++]='@';
  218.         s2[j++]='\0';
  219. }
  220.  
  221. void main()
  222. {
  223.         char a[50],b[50];
  224.         cout<<"input in @ end :"<<endl;
  225.         cin.getline ( a,sizeof ( a ) );
  226.         change ( a,b );
  227.         cout<<"dui ying de hou zhui biao da shi:"<<endl;
  228.         cout<<b<<endl;
  229.         cout<<"qiu zhi jie guo shi:"
  230.             <<compute ( b ) <<endl;
  231. }
  232.  

回复 "表达式求值(以@结尾的中缀算术表达式)"

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

captcha