java计算器༼༎ຶᴗ༎ຶ༽༼༎ຶᴗ༎ຶ༽༼༎ຶᴗ༎ຶ༽༼༎ຶᴗ༎ຶ༽,又是掉发的一天
题目:
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
示例 1:
输入:s = "1 + 1"
输出:2
示例 2:
输入:s = " 2-1 + 2 "
输出:3
示例 3:
输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23
提示:
1 <= s.length <= 3* 105
s 由数字、'+'、'-'、'('、')'、和 ' ' 组成
s 表示一个有效的表达式
'+' 不能用作一元运算(例如, "+1"和 "+(2 + 3)"无效)
'-' 可以用作一元运算(即 "-1"和 "-(2 + 3)"是有效的)
输入中不存在两个连续的操作符
每个数字和运行的计算将适合于一个有符号的 32位 整数
代码:
public int calculate(String s) { int a =0; s=s.replace(" ","");//去除空格的一个方法 List<String> a1 =new ArrayList<>(); //把整体分为小部分存入集合 String a2 =""; for (int i = 0; i <s.length() ; i++) { switch (s.charAt(i)){ case '1': a2+="1"; if (i==s.length()-1) a1.add(a2); break; case '2': a2+="2"; if (i==s.length()-1) a1.add(a2); break; case '3': a2+="3"; if (i==s.length()-1) a1.add(a2); break; case '4': a2+="4"; if (i==s.length()-1) a1.add(a2); break; case '5': a2+="5"; if (i==s.length()-1) a1.add(a2); break; case '6': a2+="6"; if (i==s.length()-1) a1.add(a2); break; case '7': a2+="7"; if (i==s.length()-1) a1.add(a2); break; case '8': a2+="8"; if (i==s.length()-1) a1.add(a2); break; case '9': a2+="9"; if (i==s.length()-1) a1.add(a2); break; case '0': a2+="0"; if (i==s.length()-1) a1.add(a2); break; case '+': if (s.charAt(i-1)==')'){ a1.add("+"); }else { a1.add(a2); a2=""; a1.add("+"); } break; case '-': if (i==0||s.charAt(i-1)==')'||s.charAt(i-1)=='('){ a1.add("-"); }else { a1.add(a2); a2=""; a1.add("-"); } break; case '*': if (s.charAt(i-1)==')'){ a1.add("*"); }else { a1.add(a2); a2=""; a1.add("*"); } break; case '/': if (s.charAt(i-1)==')'){ a1.add("/"); }else { a1.add(a2); a2=""; a1.add("/"); } break; case '(': a++; a1.add("("); break; case ')': if (s.charAt(i-1)==')'){ a1.add(")"); }else { a1.add(a2); a2=""; a1.add(")");} break; } } //把括号里面的东西先计算出来 for (int i = 0; i <a ; i++) { int b =0;//右括号下标 int b1=0;//左括号下标 //找第一个右括号 q:for (int j = 0; j <a1.size() ; j++) { switch (a1.get(j)){ case ")": b=j; break q; } } //找与之对应的左括号 o:for (int j = b-2; j >=0 ; j--) {//第一个右括号对应的左括号 switch (a1.get(j)){ case "(": b1=j; break o; } } //把括号之间的字符串值赋给字符串数组a4 String[] a4=new String[b-b1]; for (int j = b1+1; j <b ; j++) { a4[j-b1-1]=a1.get(j); } //集合中删除到只剩一个又括号 for (int j = b1; j <b ; j++) { a1.remove(b1); } // a1.set(b1,jisuan(a4)); } switch (a1.size()){ case 2: return 0-Integer.valueOf(a1.get(1)); } String[] a5=new String[a1.size()]; for (int i = 0; i <a1.size() ; i++) { a5[i]=a1.get(i); } return Integer.valueOf(jisuan(a5)); } public String jisuan(String[] a){ double s=0; if (a.length==1){ return String.valueOf(a[0]); } for (int i = 0; i <a.length-1 ; i++) { switch (a[i]){ case "+": s+=Double.valueOf(a[i+1]); i++; break; case "-": s-=Double.valueOf(a[i+1]); i++; break; case "*": s*=Double.valueOf(a[i+1]); i++; break; case "/": s/=Double.valueOf(a[i+1]); i++; break; default: s+=Double.valueOf(a[i]); } } return String.valueOf((int)s); }
思路:
………………我有思路嘛,我感觉我就是一步一步强行拆分出来的,先判断有没有括号,有的话先把括号里面的算出来,然后代替了括号括号里面的这些个字符串(也包括,括号),最后得到一个没有括号的字符串,然后如果存在负数,然后用0去一个一个加就好了
浙公网安备 33010602011771号