作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

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

输入字符串长度不超过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);elsereturn stoi(s.substr(start,end-start));
}int main()
{string str;while(cin>>str){if(!check(str))cout<<-1<<endl;elsecout<<calculate(str, 0, str.size())<<endl;}return 0;
}

华为机试HJ54:表达式求值相关推荐

  1. 华为机试HJ38:求小球落地5次后所经历的路程和第5次反弹的高度

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 假设一个球从任意高度自由落下,每次落地后反跳回原高度的一半; 再落下, 求它在第5次 ...

  2. 华为机试HJ108:求最小公倍数

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法, ...

  3. 华为机试HJ15:求int型正整数在内存中存储时1的个数

    作者:Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数. 输入描述: 输入一 ...

  4. 【牛客网华为机试】HJ15 求int型正整数在内存中存储时1的个数

    题目 描述 输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数. 输入描述: 输入一个整数(int类型) 输出描述: 这个数转换成2进制后,输出1的个数 示例1 输入: 5 输出: ...

  5. 华为机试108题(C 语言解答)

    Nowcoder题库链接:华为机试 HJ1 字符串最后一个单词的长度(字符串) 输入:hello nowcoder输出:8说明: 最后一个单词为nowcoder,长度为8 示例代码: HJ1.c #i ...

  6. 华为机试--简单题(一)

    HJ14 字符串排序 知识点:字符串:排序 描述 给定 n 个字符串,请对 n 个字符串按照字典序排列. 数据范围: 1≤n≤1000 ,字符串长度满足1≤len≤100 输入描述: 输入第一行为一个 ...

  7. 【HUAWEI】华为机试试题-105

    LeeCode试题链接直接上 HJ1 字符串最后一个单词的长度 HJ2 计算某字符出现次数 HJ3 明明的随机数:随机数去重排序输出(小-大) HJ4 字符串分隔:输入一个字符串,请按长度为8拆分每个 ...

  8. 华为机试 计算加减乘除数学表达式的结果

    源   代码链接http://codepad.org/s7KRVYiV #include <stdlib.h> #include <stdio.h> #include < ...

  9. 华为机试第十五题:HJ15 求int型正整数在内存中存储时1的个数

    华为机试第十五题:HJ15 求int型正整数在内存中存储时1的个数 一.网址链接 二.题目描述 ①描述 ②输入描述 ③输出描述 ④示例一 ⑤示例二 三.代码实现 ①Java代码实现 ②C++代码实现 ...

最新文章

  1. python实现人脸识别抓取人脸并做成熊猫头表情包(2)之优化
  2. 《循序渐进学Spark》一3.5 容错机制及依赖
  3. vscode pylint 错误_将实际未错误的py库添加到pylint白名单
  4. 搭建环境_maven: 搭建工程: ssm整合: 搭建测试:
  5. 【struts2】struts2的零配置
  6. Deepgreen数据库日志清理脚本
  7. python 管理windows客户端_在远程windows客户端上执行python脚本
  8. (72)信号发生器DDS方波设计 (二)(第15天)
  9. php加载lrc,javascript - 【求助】php如何获取虾米网的LRC地址?
  10. python糖尿病数据挖掘
  11. C实现NV12转I420
  12. ORacle查询时显示同义词转换不再有效
  13. 波导缝隙天线仿真出现较大副瓣,添加波导端口吸收副瓣
  14. navicat 1062报错
  15. 入门Python需要掌握的技能有哪些?
  16. Android蓝牙通信
  17. LTE语音业务 - VOLTE
  18. 申宝证券-个股分化严重
  19. 仿哔哩哔哩视频app小程序模板源码
  20. echarts之静态与动态地图

热门文章

  1. ListT to DataTable
  2. 一篇文章弄懂 JavaScript 中的 import
  3. OAuth 及 移动端鉴权调研
  4. 今后,去踢“大数据足球”
  5. 如果多个用户同时修改同一客户记录,而且先后提交修改,Oracle 怎样保证该客户记录...
  6. c/c++中的引用变量
  7. Nokia防火墙配置过程
  8. 8-5安装redis-sentinel
  9. django 查询mysql_Django 数据库查询方法一
  10. Python爬虫怎么学?面向招聘岗位职责学习,看看你的技术能拿多少薪资