表达式求值

利用算数运算符的优先关系,实现对算术四则混合运算表达式的求值。

要求:

1)表达式包含的运算符只能有'+' '-' '*' '/' '(' ')'

输入的形式:如2*(3+4)

2)输出的形式:例如2*(3+4)=14

老规矩,没有错误,均可运行

#include <stdio.h> 
#include <stdlib.h> 
#define MaxSize 30   
void  trans(char str[],char exp[]) 
{   
 struct  
 {    
  char data[MaxSize];   
  int top;  
 } op;  
char ch;  int i=0,t=0;  
op.top=-1;  
ch=str[i]; 
 i++;   
while(ch!='\0')  
{   
 switch(ch)   
 {  
	case '(' :     op.top++;      op.data[op.top]=ch;     break;    
	case ')' :  while(op.data[op.top]!='(')     
			{  exp[t]=op.data[op.top];  op.top--;  t++;   }     
			op.top--;     break; 
	case '+' :    
	case '-' : 
			while(op.top!=-1 && op.data[op.top]!='(')    
				{   exp[t]=op.data[op.top];      
					op.top--;      t++;     } 
			op.top++;      
			op.data[op.top]=ch;     break;
	case '*' :    
	case '/' : while(op.data[op.top]=='*' || op.data[op.top]=='/')    
			{   exp[t]=op.data[op.top];      op.top--;      t++;     }  
			op.top++;      
			op.data[op.top]=ch;     break;    
	case ' ' :     break;    
	default :  while(ch>='0' && ch<='9')     
			{    exp[t]=ch;  t++;    ch=str[i];     i++;     }     
			i--;     
		 	exp[t]=' ';    
		 	t++;   
	}   
 ch=str[i];  
 i++;  
}   
while(op.top!=-1)  
{  exp[t]=op.data[op.top]; 
   t++;   
   op.top--;  
}  
 exp[t]='\0'; 
}  


 

float  compvalue(char exp[])

{  

struct 

{   

float data[MaxSize]; 

   int top; 

} st;

float  d; 

char ch; 

int t=0; 

st.top=-1; 

ch=exp[t]; 

t++;  

while(ch!='\0') 

{  

 switch(ch)  

 {      case '+' :

st.data[st.top-1]=st.data[st.top-1]+st.data[st.top];

                st.top--;

                 break;

 

  case '-' : 

st.data[st.top-1]=st.data[st.top-1]-st.data[st.top];

                 st.top--;

                 break;

 

  case '*' :

st.data[st.top-1]=st.data[st.top-1]*st.data[st.top];

                st.top--;

                break; 

  case '/' :

if (st.data[st.top]!=0)

                st.data[st.top-1]=st.data[st.top-1]/st.data[st.top];

           else

                 {  

                        printf("\n除数不可以为零!\n");

                  exit(0);        

                 }

       st.top--;break;

 

  default :    d=0;    

                while(ch>='0' && ch<='9')  

                {  d=10*d+ch-'0';    

ch=exp[t];    

t++;    }    

                    st.top++;   

                       st.data[st.top]=d;

  }  

ch=exp[t];

t++;

  }  

return   st.data[st.top];

}  

void main() { char str[MaxSize]={"\0"},exps[MaxSize]={"\0"}; printf("请输入含有 +-*/()的表达式:"); gets(str); trans(str,exps); printf("%s=",str); printf("%.2f\n",compvalue(exps)); }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值