简单表达式求值

来源:互联网 发布:淘宝上质量好的鞋店 编辑:程序博客网 时间:2024/05/22 04:54

 

此表达式求值程序利用Stack实现

/******************************
Date: 
     2006 - 10 -24
Description:
 This programe is aiming to
 carry out operator counting by
 using of sequence stack
******************************
*/

#include 
"stdio.h"
#define MAXSIZE 128
typedef 
char DataType;
int pIFX = 0;
int pPFX = 0;
int pTP = 0;

/***Define a Stack Struct***/
typedef 
struct 
{
        DataType stack[MAXSIZE];
        }
SeqStack;
/**********初始化PFX IFX************/

SeqStack PFX;
SeqStack IFX;
SeqStack TP;

/***************************
Function: Stack push
Param:    SeqStack ss, char dat
Return:   SeqStack
***************************
*/

SeqStack Push(SeqStack s, 
char dat)
{
         s.stack[pPFX] 
= dat;
         
return s;
         
         }
              
/***************************
Function: Stack pop
Param:    SeqStack ss, char dat
Return:   SeqStack
***************************
*/

SeqStack Pop(SeqStack s, 
char dat)
{
         
}

int CtoD(char c)
{
    
return(c - '0');
}

char DtoC(int x)
{
    
return(x + 48);
}
               

char InputPression(void)
{
     
int i = 0;
     
char ch;
     scanf(
"%c",&ch);
     
while(ch!= '=')
     
{
          IFX.stack[i 
++= ch;
          scanf(
"%c",&ch);          
     }

     IFX.stack[i] 
= '=';

}
   
 
void PrintStack(SeqStack s)
{
      
int i = 0;
      
while(s.stack[i] != '=')
      printf(
"%c",s.stack[i++]);
      getchar();
      getchar();
     }
  
SeqStack toSufix()
{
     
int pIFX = 0;
     
char ch;
     TP.stack[pTP
++= '=';
     
while(IFX.stack[pIFX]!= '=')
     
{
         ch 
= IFX.stack[pIFX];
         
switch(ch)
         
{
              
case '0':case '1':case '2':case '3':
              
case '4':case '5':case '6':case '7':
              
case '8'case'9':
                   PFX.stack[pPFX
++= ch;
                   
                   
break;
              
case '(':
                   TP.stack[
++pTP] = '(';
                   
                   
break;
              
case ')':
                   
while(TP.stack[pTP] != '(')
                   
{
                       PFX.stack[pPFX
++= TP.stack[pTP];
                       pTP
--;
                   }

                   pTP
--;
                 
                   
break;
              
case '+':
              
case '-':
                   
while(
                   (pTP 
> 1 && TP.stack[pTP] != '('&&
                   (TP.stack[pTP]
== '+' || TP.stack[pTP]== '-')
                   )
                   PFX.stack[pPFX
++= TP.stack[pTP--];
                   pTP 
++;
                   TP.stack[pTP]
= ch;
                   
                   
break;
               
case '*':
               
case '/':
                    
while(
                    pTP 
> 1 && 
                    (TP.stack[pTP]
== '*' || TP.stack[pTP]== '/')
                    )
                    PFX.stack[pPFX
++= TP.stack[pTP--];
                    pTP
++;
                    TP.stack[pTP] 
= ch;
                    
                    
break;    
                    }
/*end switch*/  
                pIFX
++;              
     }
/*end while*/
     
while(pTP > 1)
     PFX.stack[pPFX
++= TP.stack[pTP--];
     PFX.stack[pPFX] 
= '=';
}

int Computing()  
{
    
char ch;
    
char tmp1;
    
char tmp2;
    
int tmp;
    pPFX 
= 0;
    pIFX 
= 0;
    pTP 
= 0;
    
while(PFX.stack[pPFX]!= '=')
    
{
        ch 
= PFX.stack[pPFX];
        
switch(ch)
        
{
            
case '0':case '1':case '2':case '3':
            
case '4':case '5':case '6':case '7':
            
case '8'case'9':
               pTP
++;
               TP.stack[pTP] 
= ch;
               
break
            
case '+':
                tmp1 
= TP.stack[pTP--];
                tmp2 
= TP.stack[pTP--];
                tmp 
= CtoD(tmp1) + CtoD(tmp2);
                TP.stack[
++pTP] = DtoC(tmp);
                
break;
            
case '-':
                tmp1 
= TP.stack[pTP--];
                tmp2 
= TP.stack[pTP--];
                tmp 
= CtoD(tmp1) - CtoD(tmp2);
                TP.stack[
++pTP] = DtoC(tmp);
                
break;
            
case '*':
                tmp1 
= TP.stack[pTP--];
                tmp2 
= TP.stack[pTP--];
                tmp 
= CtoD(tmp1) * CtoD(tmp2);
                TP.stack[
++pTP] = DtoC(tmp);
                
break;
            
case '/':
                tmp1 
= TP.stack[pTP--];
                tmp2 
= TP.stack[pTP--];
                tmp 
= CtoD(tmp1) / CtoD(tmp2);
                TP.stack[
++pTP] = DtoC(tmp);
                
break;
                
        }
/*end switch*/
        pPFX 
++;
    }
/*end while*/
    
return(CtoD(TP.stack[1]));
}



/******************************
   Main Function
******************************
*/
        
int main()
{
    printf(
"Input count pression: ");
    InputPression();
    PrintStack(IFX);
    PFX 
= toSufix();
    PrintStack(PFX);
    printf(
"%d",Computing());
    getchar();
}

        
 未完成...
原创粉丝点击