华为机试—四则运算(数组解决)
2014-12-26 11:11
711 查看
题目:四则运算
问题描述:
输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
注:
3.1、表达式只含 +, -, *, / 四则运算符,不含括号
3.2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况
3.3、要考虑加减乘除按通常四则运算规定的计算优先级
3.4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生
3.5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况
要求实现函数:
int calculate(int len,char *expStr)
【输入】 int len: 字符串长度;char *expStr: 表达式字符串;
【输出】 无
【返回】 计算结果
示例:
1)输入:char *expStr = “1+4*5-8/3”
函数返回:19
2)输入:char *expStr = “8/3*3”
函数返回:6
问题分析:
题目要求很简单,只是计算个位数的四则运算,且没有括号。主要考察栈的运用,实现时采用两个辅助栈,一个用来存放操作数,一个用来存放操作符。根据操作符的优先级进行计算。这个题目在严蔚敏《数据结构》这本书将栈的时候详细介绍了实现过程。
基本思路:
两个数组分别存储操作数和操作符,扫描输入的字符串,当遇到*和/的时候,边计算边存储,将计算结果存到操作数的数组中,当遇到+和-号时只存储不计算。当所有数据存储完毕后,因为运算就只剩下+-运算了,因为+-符合交换原则,所以用类似于栈的方式,从数组末尾开始运算,同时每次将运算结果存储操作数的数组中,最后四则运算的结果就是操作数的数组中剩下的那个。
具体实现:
测试结果,可能想的不周全,欢迎查漏补缺:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/15/35be2113aece2e0cf6c390834a65fa68)
问题描述:
输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
注:
3.1、表达式只含 +, -, *, / 四则运算符,不含括号
3.2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况
3.3、要考虑加减乘除按通常四则运算规定的计算优先级
3.4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生
3.5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况
要求实现函数:
int calculate(int len,char *expStr)
【输入】 int len: 字符串长度;char *expStr: 表达式字符串;
【输出】 无
【返回】 计算结果
示例:
1)输入:char *expStr = “1+4*5-8/3”
函数返回:19
2)输入:char *expStr = “8/3*3”
函数返回:6
问题分析:
题目要求很简单,只是计算个位数的四则运算,且没有括号。主要考察栈的运用,实现时采用两个辅助栈,一个用来存放操作数,一个用来存放操作符。根据操作符的优先级进行计算。这个题目在严蔚敏《数据结构》这本书将栈的时候详细介绍了实现过程。
基本思路:
两个数组分别存储操作数和操作符,扫描输入的字符串,当遇到*和/的时候,边计算边存储,将计算结果存到操作数的数组中,当遇到+和-号时只存储不计算。当所有数据存储完毕后,因为运算就只剩下+-运算了,因为+-符合交换原则,所以用类似于栈的方式,从数组末尾开始运算,同时每次将运算结果存储操作数的数组中,最后四则运算的结果就是操作数的数组中剩下的那个。
具体实现:
#include <iostream> using namespace std; int calculate(int len,char *expStr) { int result =0; int* datas = new int[len]; //用数组模拟操作数栈 char* opers = new char[len]; //用数组模拟操作符栈 int dataTop = -1; int operTop = -1; memset(datas,0,len*sizeof(int)); memset(opers,0,len*sizeof(char)); for(int i=0;i<len;++i) { if(expStr[i] >= '0' && expStr[i] <= '9') datas[++dataTop] = expStr[i]-'0'; if(expStr[i] == '+' || expStr[i] == '-' || expStr[i] == '*' || expStr[i] == '/') { char oper = expStr[i]; if(oper =='*' || oper =='/') { int num1 = datas[dataTop--]; int num2 = expStr[++i]-'0'; if(oper =='*') num1*= num2; else if(oper =='/') num1/=num2; datas[++dataTop] = num1; } else opers[++operTop] = expStr[i]; } } while(operTop!=-1) { char oper = opers[operTop--]; int num1 = datas[dataTop--]; int num2 = datas[dataTop--]; if(oper == '+') num2+=num1; else if(oper =='-') num2-=num1; datas[++dataTop]=num2; } result = datas[dataTop]; return result; } int main() { char a[100]; while(cin>>a){ int len = strlen(a); cout<<calculate(len,a)<<endl; } cout<<endl; return 0; }
测试结果,可能想的不周全,欢迎查漏补缺:
相关文章推荐
- 华为机试—约瑟夫环替换计数器m(数组解决)
- 华为机试数组比较
- 地铁换乘—华为2014校招机试样题 —Dijkstra 和 Floyd-Warshall 算法解决
- [华为机试练习题]56.求子数组的最大和
- [华为机试练习题]21.二维数组的列排序
- 华为2013年西安java机试题目:如何过滤掉数组中的非法字符。
- 华为机试——数组循环移位
- 华为机试—整数数组排序(字符串输入输出)
- 华为机试—整数数组排序(字符串输入输出)
- 华为机试——找出数组中不同的两个数
- 华为招聘机试整理2:判断一个数组的元素是否是回文
- 华为机试---数组按规则排列
- [华为机试]求出数组中所有奇数之和以及所有偶数之和
- 华为机试—N皇后问题(高级题160分:两种回溯法解决 吐血整理)
- 华为机试—四则运算
- java 华为机试题目-数组处理
- 华为招聘机试整理14:数组奇数偶数排序
- 华为机试:数组操作系统任务调度
- 华为机试:从一个数组中选取不同的数(均小于10)组成一个最大的三位数
- 华为机试——找出数组中不同的数字