您的位置:首页 > 理论基础 > 数据结构算法

表达式求值

2017-06-05 17:06 127 查看
利用算数运算符的优先关系,实现对算术四则混合运算表达式的求值。

要求:

(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));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息