C语言 中缀表达式
发布网友
发布时间:2022-05-21 14:48
我来回答
共1个回答
热心网友
时间:2023-11-20 20:58
写了个,你试试。
#include <stdio.h>
#define is_digit(ch) ((ch) >= '0' && (ch) <= '9')
char pri[7][7] =
{
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','$'},
{'>','>','>','>','$','>','>'},
{'<','<','<','<','<','$','='},
};
int get_cal_index(char c)
{
switch(c)
{
case '+': return 0;
case '-': return 1;
case '*': return 2;
case '/': return 3;
case '(': return 4;
case ')': return 5;
case '#': return 6;
}
return -1;
}
int main(void)
{
char infix[200];
char suffix[200];
char cal[200];
char *np,*ip,*sp,*cp;
int nci, oci;
gets(infix);
infix[strlen(infix) +1] = '\0';
infix[strlen(infix)] = '#';
cal[0] = '#';
ip = infix;
sp = suffix;
cp = cal;
while(*ip)
{
if(is_digit(*ip))
{
int has_dot = 0;
while(is_digit(*ip) || *ip == '.')
{
*sp++ = *ip;
*sp++ = ' ';
if(*ip == '.')
{
if(has_dot)
{
printf("错误的计算数");
exit(-1);
}
has_dot = 1;
}
ip++;
}
ip--;
}
else
{
nci = get_cal_index(*ip);
if(nci == -1)
{
printf("错误的运算符");
exit(-1);
}
oci = get_cal_index(*cp);
while(pri[oci][nci] == '>')
{
*sp++ = *cp--;
*sp++ = ' ';
oci = get_cal_index(*cp);
}
if(pri[oci][nci] == '<')
{
*++cp = *ip;
}
else if(pri[oci][nci] == '=')
{
if(*ip == ')')
cp--;
else if(*ip == '#')
break;
}
else if(pri[oci][nci] == '$')
{
printf("错误的表达式");
exit(-1);
}
}
ip++;
}
*sp = '\0';
puts(suffix);
return 0;
}
追问
输入多位数和有小数点的就不行了诶?
追答
呵呵,有个小失误。main里if(is_digit(*ip))那一段改了一下,把输出空格的位置换了一下。
if(is_digit(*ip))
{
int has_dot = 0;
while(is_digit(*ip) || *ip == '.')
{
*sp++ = *ip;
if(*ip == '.')
{
if(has_dot)
{
printf("错误的计算数");
exit(-1);
}
has_dot = 1;
}
ip++;
}
*sp++ = ' ';
ip--;
}