蓝桥杯 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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值