您的位置:首页
华为招聘机试整理5:简单四则运算
2018-04-10 20:50
393 查看
华为招聘机试整理5:简单四则运算
题目:简单四则运算问题描写叙述: 输入一个仅仅包括个位数字的简单四则运算表达式字符串,计算该表达式的值
注:
1、表达式仅仅含 +, -, 乘, / 四则运算符,不含括号
2、表达式数值仅仅包括个位整数(0-9)。且不会出现0作为除数的情况
3、要考虑加减乘除按通常四则运算规定的计算优先级
4、除法用整数除法。即仅保留除法运算结果的整数部分。比方8/3=2。输入表达式保证无0作为除数情况发生
5、输入字符串一定是符合题意合法的表达式。当中仅仅包括数字字符和四则运算符字符,除此之外不含其他不论什么字符,不会出现计算溢出情况
要求实现函数:
int calculate(int len,char
expStr)
【输入】 int len: 字符串长度;
char expStr: 表达式字符串;
【输出】 无
【返回】 计算结果
演示样例
1) 输入:char
expStr = “1+45-8/3”
函数返回:19
2) 输入:char
expStr = “8/33”
函数返回:6
题目分析:
①这道题输入字符串中有可能有五种字符,数字、+、-、*、/。
②这道题还须要注意的是我们要依照运算法则来进行计算。所以我们要选择用栈来解决这道题
算法思路:
①用字符串数组当做符号+-/的栈;用int数组作为数字的栈
②入栈过程:
数字栈:检測假设为数字,我们直接-‘0’放入number中。
符号栈:
1)+ - :由于它们运算优先级比較低,所以我们须要入栈出栈
检測为+-时候,我们直接放入sign中
2)* / :由于运算优先级别比較高。所以哦我们能够直接运算
这里须要注意索引。这个时候数字索引应该-1,可是字符串的索引应该加1,之后还须要+1(由于已经运算完了)
/须要多注意一个地方,就是分母不能为0,为0时候,直接返回-1;
③出栈过程
1)首先第一步我们须要把两个栈的索引都减去1
2)之后用符号索引进行for循环,假设检測为加号。由于我们须要把数字都放入数字的前一个索引里面,数字索引须要减去1先。之后再运算
3)最后出栈结束返回number[0]就能够了
=====================================================================
參考代码:
//简单四则运算.cpp //2014.7.10 hepanhui #include <iostream> #include <string> #include <ctype.h> const int maxn = 1000; using namespace std; int calculate(int len, char *expStr) { //非法输入 if(expStr == NULL) return -1; //定义一个char数组当做符号栈,int数组当做数字栈 char sign[maxn]; int sign_index = 0; int number[maxn]; int number_index = 0; for(int i = 0; i < len; i++) { //堆栈过程 if(isdigit(expStr[i])) { number[number_index ++] = expStr[i] - '0'; continue; } if(expStr[i] == '+' || expStr[i] == '-') { sign[sign_index ++] = expStr[i]; continue; } if(expStr[i] == '*') { number[number_index - 1] *= expStr[i+1] - '0'; i++; continue; } if(expStr[i] == '/') { if(expStr[i+1] != '0') { number[number_index - 1] /= expStr[i+1] - '0'; i++; continue; } else return -1; } } //出栈过程 number_index--; sign_index--; for(int i = sign_index;i >= 0; i--) { if(sign[i] == '+') { number_index --; number[number_index] += number[number_index + 1]; continue; } if(sign[i] == '-') { number_index --; number[number_index] -= number[number_index + 1]; continue; } } return number[0]; } int main() { int len; cin >> len; char str[maxn]; cin >> str; cout << calculate(len,str) << endl; return 0; }
调试过程中易犯错误的地方:
①当子函数返回为int型时候。我们非法输入的时候一样不能写return 0 最好写return -1
②出栈的时候要特别注意先将索引直接-1。
④运算过程中也须要注意,我们也要先把数字索引减去1,为了终于返回number[0]保存终于结果。
相关文章推荐
- 华为招聘机试整理12:合并字符串
- 华为招聘机试整理14:数组奇数偶数排序
- 华为招聘机试整理11:实现字符串间隔输出
- 华为招聘机试整理13:算分数的问题
- 华为招聘机试整理8:操作系统任务调度问题
- 华为招聘机试整理14:数组奇数偶数排序
- 华为招聘机试整理6:选秀节目打分
- 华为校园招聘java机试整理
- 华为招聘机试整理13:算分数的问题
- 华为招聘机试整理9:输入一个字符串,用指针求出字符串的长度
- 华为招聘机试整理10:实现字符串中子字符串的替换
- 华为招聘机试整理10:实现字符串中子字符串的替换
- 华为招聘机试整理2:判断一个数组的元素是否是回文
- 华为招聘机试整理5:简单四则运算
- 华为招聘机试整理15:约瑟夫环
- 华为招聘机试整理3:数组比较
- 华为招聘机试整理9:输入一个字符串,用指针求出字符串的长度
- 华为招聘机试整理1:删除子串
- 华为招聘机试整理4:手机号码合法性判断
- 华为招聘机试整理11:实现字符串间隔输出