利用算数运算符的优先关系,实现对算术四则混合运算表达式的求值。
要求:
(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));
}