华为机试HJ54:表达式求值

简介: 华为机试HJ54:表达式求值

题目描述:

给定一个字符串描述的算术表达式,计算出结果值。

输入字符串长度不超过100,合法的字符包括”+, -, *, /, (, )”,”0-9”,字符串内容的合法性及表达式语法的合法性由做题者检查。本题目只涉及整型计算。

输入描述:

输入算术表达式

输出描述:

计算出结果值

示例:

输入:

400+5


输出:

405

解题思路:

本题有两个要点:

1.检查表达式合法性。首先利用sheet字典,确保字符串中字符都符合要求;其次判断左右括号数是否一致。

2.calculate函数实现表达式计算。左右有括号就缩进;先找加减法再找乘除;找到运算符后,左右两侧字符串再调用calculate,进行递归;递归至不再包含运算符后退回,返回数字。递归结束,结果输出。

测试代码:

#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<char> sheet={'+','-','*','/','(',')','0','1','2','3','4','5','6','7','8','9'};
// 检查合理性
bool check(string &s)
{
    int left=0;
    int right=0;
    for(int i=0;i<s.size();++i)
    {
        bool isok=false;
        for(int j=0;j<sheet.size();++j)
        {
            if(s[i]=='(')
                left++;
            if(s[i]==')')
                right++;
            if(s[i]==sheet[j])
                isok=true;
        }
        if(!isok)
            return false;
    }
    if(left!=right)
        return false;
    return true;
}
// 算术表达式计算
int calculate(string &s,int start,int end)
{
    if(s[start]=='('&&s[end-1]==')')
    {
        ++start;
        --end;
    }
    int layer=0,am=0,md=0;
    bool flag=false;
    for(int i=start;i<end;++i)
    {
        if(s[i]=='(')
        {
            ++layer;
            flag=true;
        }
        else if(s[i]==')')
        {
            --layer;
            flag=true;
        }
        else if((s[i]=='+'||s[i]=='-')&&!layer)
            am=i;
        else if((s[i]=='*'||s[i]=='/')&&!layer)
            md=i;
    }
    if (am > start) {
        if (s[am] == '+') 
            return calculate(s, start, am) + calculate(s, am+1, end);
        else 
            return calculate(s, start, am) - calculate(s, am+1, end);
    } 
    else if (md > start) 
    {
        if (s[md] == '*') 
            return calculate(s, start, md) * calculate(s, md+1, end);
        else 
            return calculate(s, start, md) / calculate(s, md+1, end);
    }
    else if(flag)
        return calculate(s,start+1,end-1);
    else
        return stoi(s.substr(start,end-start));
}
int main()
{
    string str;
    while(cin>>str)
    {
        if(!check(str))
            cout<<-1<<endl;
        else
            cout<<calculate(str, 0, str.size())<<endl;
    }
    return 0;
}
相关文章
|
1月前
|
测试技术
【动态规划】【字符串】【表达式】2019. 解出数学表达式的学生分数
【动态规划】【字符串】【表达式】2019. 解出数学表达式的学生分数
|
1月前
|
Java C++ Python
acwing 3302. 表达式求值
acwing 3302. 表达式求值
|
8月前
|
C++ Python
华为机试HJ50:四则运算
华为机试HJ50:四则运算
110 0
|
8月前
|
容器
华为机试HJ89:24点运算
华为机试HJ89:24点运算
106 0
|
8月前
华为机试HJ57:高精度整数加法
华为机试HJ57:高精度整数加法
|
存储 算法
每日一题——逆波兰表达式求值(前缀、中缀、后缀表达式的说明,库函数atoi()的解析)
每日一题——逆波兰表达式求值(前缀、中缀、后缀表达式的说明,库函数atoi()的解析)
|
存储 算法
逆波兰表达式:计算包含括号的四则运算表达式
平时我们进行数学计算使用的常见书写方式就是中缀表达式,即每一个运算符号都位于计算数的中间,如下: (1+2)\3 而这对于计算机进行求取结果来说,并不是一个最优的方案。
90 0
|
算法
LeetCode每日1题--逆波兰表达式求值
LeetCode每日1题--逆波兰表达式求值
76 0
【代码随想录】LC 150. 逆波兰表达式求值
目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 字符串转数字,数字转字符串
55 0
|
算法