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
- Java 复杂计算器的实现
- 复杂计算器的实现,没有界面
- 我的计算器. 用java实现的. 可以支持复杂表达式
- 【计算器Java实现】基于栈的复杂表达式解析&&数值计算
- java实现的计算器
- 蓝懿教育 复杂版计算器的实现
- 简单计算器的java实现
- java实现简单的计算器
- Java实现的简单计算器
- 简单计算器的Java实现
- 《java---简单计算器的实现》
- java实现计算器的代码
- java计算器的是实现
- java高级计算器的实现
- java实现加减的计算器。。。
- Java简单计算器的实现
- 每日20行之4~~~两种方法java实现简易计算器 附带复杂计算器代码(优先级顺序)
- 我的计算器. 用java实现的
- SNMP 在Windows上建一个SNMP服务 Win7下注意事项
- MyEclipse8.5 注册方法
- ServerSocket 默认邦定IP
- 什么是持久化?
- 用Java信号量 解决死锁
- Java 复杂计算器的实现
- Spring 发送邮件 简单邮件
- Struts2的拦截器
- Spring 发送邮件 HTML邮件
- Spring 发送邮件 内嵌图片增加附件
- openssl学习笔记
- Spring 发送邮件 使用File指定附件
- 快乐快乐ioui哦就会好几个
- Spring MVC 入门示例