算法训练 表达式计算
时间限制:1.0s 内存限制:256.0MB
问题描述
输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
输入一行,包含一个表达式。
输出格式
输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
表达式长度不超过100,表达式运算合法且运算过程都在int内进行。
分析:这里我使用的是递归下降分析法。写出文法产生式:
#include <stdio.h>
char expression[105] = { 0 };
int idx;
int number;
char op;
int is_operator;
int E();
int T();
int F();
void get_next()
{
if ('0' <= expression[idx] && expression[idx] <= '9')
{
number = expression[idx] - '0';
idx++;
while ('0' <= expression[idx] && expression[idx] <= '9')
{
number = number * 10 + expression[idx] - '0';
idx++;
}
is_operator = 0;
}
else
{
op = expression[idx++];
is_operator = 1;
}
}
int E()
{
int value1 = T();
while (is_operator)
{
if (op == '+')
{
get_next();
int value2 = T();
value1 = value1 + value2;
}
else if (op == '-')
{
get_next();
int value2 = T();
value1 = value1 - value2;
}
else
break;
}
return value1;
}
int T()
{
int value1 = F();
while (is_operator)
{
if (op == '*')
{
get_next();
int value2 = F();
value1 = value1 * value2;
}
else if (op == '/')
{
get_next();
int value2 = F();
value1 = value1 / value2;
}
else
break;
}
return value1;
}
int F()
{
if (is_operator)
{
get_next();
int value = E();
get_next();
return value;
}
else
{
int value = number;
get_next();
return value;
}
}
int main()
{
scanf("%s", expression);
idx = 0;
get_next();
int ans = E();
printf("%d", ans);
return 0;
}