蓝桥杯 ALGO-156 算法训练 表达式计算

算法训练 表达式计算  

时间限制:1.0s   内存限制:256.0MB

问题描述

  输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。

输入格式

  输入一行,包含一个表达式。

输出格式

  输出这个表达式的值。

样例输入

1-2+3*(4-5)

样例输出

-4

数据规模和约定

  表达式长度不超过100,表达式运算合法且运算过程都在int内进行。

分析:这里我使用的是递归下降分析法。写出文法产生式:

\begin{align*} E &\rightarrow E + T ~|~ E - T ~|~ T \\ T &\rightarrow T * F ~|~ T / F ~|~ F \\ F &\rightarrow \textbf{num} ~|~ ( ~E~ ) \end{align*}

#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;
}
发布了221 篇原创文章 · 获赞 40 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/liulizhi1996/article/details/103997837