Java 复杂计算器的实现

来源:互联网 发布:淘宝上怎么开店 编辑:程序博客网 时间:2024/06/05 04:55

已经两次有公司面试上机,做这个题目,下面说一下实现思路。

 

要求:给予的字符串是标准可以做有效运算的字符串,只包含加减乘除和数字,其中最前和最后是数字

思路:先把字符串以运算符进行分割,把数字和运算符放到集合中。然后先做乘除运算,因为乘除必须先做。然后做加减计算,最后打印结果。

备注:这里只是实现思路,没有SWING实现。下面计算:30*1+4*2*10-10+40/20的结果。

 

实现代码如下,关键地方带有注释:

package test;import java.util.ArrayList;import java.util.List;/** * 复杂计算器 * @author 崔素强 */public class Calculator {public static void main(String[] args) {// 规则,只能出现数字和加减乘除符号,最前和最后都是数字,即字符串能有效计算的String text = "30*1+4*2*10-10+40/20";// 计算内容分割List<String> numList = new ArrayList<String>();int splitIndex = 0;for(int i=0;i<text.length();i++){char c = text.charAt(i);if(c == '+'||c == '-'||c=='*'||c=='/'){numList.add(text.substring(splitIndex, i));numList.add(c+"");splitIndex = i+1;}}// 因为使用符号做判断,增加前一位和符号,所以最后一位数字不会在循环里处理numList.add(text.substring(splitIndex, text.length()));System.out.println("====分割后====");for(int i=0;i<numList.size();i++){System.out.println(i + " -> " + numList.get(i));}// 先做乘除计算List<String> list = new ArrayList<String>();Integer temp = null; // 用于做乘除计算临时变量for(int i=1;i<numList.size();i+=2){ // 这里只循环运算符号if("+".equals(numList.get(i))||"-".equals(numList.get(i))){if(null != temp){ // 存在临时变量,说明前面进行过乘除计算list.add(temp.toString());temp = null;} else {list.add(numList.get(i-1));}list.add(numList.get(i)); // 把符号加进去if(i==numList.size()-2) { // 处理到最后时遇到直接处理 list.add(numList.get(i+1));}}else if("*".equals(numList.get(i))){if(null == temp){temp = Integer.parseInt(numList.get(i-1)) * Integer.parseInt(numList.get(i+1));}else{temp = temp * Integer.parseInt(numList.get(i+1));}if(i==numList.size()-2) { // 处理到最后时遇到直接处理list.add(temp.toString());temp = null;}}else if("/".equals(numList.get(i))){if(null == temp){temp = Integer.parseInt(numList.get(i-1)) / Integer.parseInt(numList.get(i+1));}else{temp = temp / Integer.parseInt(numList.get(i+1));}if(i==numList.size()-2) { // 处理到最后时遇到直接处理list.add(temp.toString());temp = null;}}}System.out.println("====乘除后====");for(int i=0;i<list.size();i++){System.out.println(i + " -> " + list.get(i));}// 再做加减计算Integer sum = Integer.parseInt(list.get(0)); // 第一位不会在循环里处理for(int i=1;i<list.size();i+=2){ // 这里只循环运算符号if("+".equals(list.get(i))){sum += Integer.parseInt(list.get(i+1));}else if("-".equals(list.get(i))){sum -= Integer.parseInt(list.get(i+1));}}System.out.println("====最终值====");// 打印结果System.out.println(sum);}}

 

打印结果:

====分割后====0 -> 301 -> *2 -> 13 -> +4 -> 45 -> *6 -> 27 -> *8 -> 109 -> -10 -> 1011 -> +12 -> 4013 -> /14 -> 20====乘除后====0 -> 301 -> +2 -> 803 -> -4 -> 105 -> +6 -> 2====最终值====102

 

其中分割和加减计算比较简单,乘除运算需要使用临时变量和做到最后时的判断,稍微复杂。

 

请您到ITEYE网站看 java小强 原创,谢谢!

http://cuisuqiang.iteye.com/ 

自建博客地址:http://www.javacui.com/ ,内容与ITEYE同步!

0 0
原创粉丝点击