最近学习Java作业是用栈做一个表达式计算器。
我经过思考和学习另辟蹊径 寻找到一种【文本处理】方法 来进行复杂表达式的计算
例 输入:1+(5*5) 例 输出:26
例 输入:1+5 例 输出:6
代码主要用到两个字符串处理方法:
str.indexFo(‘x’) // 在 str 中寻找字符 x 的位置,成功返回位置,否则返回-1;str.substring(a,b) //a,b为整型,意为从str中截取字符串,从a位置到b位置,返回类型为String以下是本人的代码
float num1,num2; char op; public float cal(float num1,float num2,char op) { float sum = 0; switch (op) { case '+' :sum = num1 + num2;break; case '-' :sum = num1 - num2;break; case '*' :sum = num1 * num2;break; case '/' :sum = num1 / num2;break; } return sum ; } } import java.util.Scanner; public class SimpleCalc { String excmple; float result; public SimpleCalc(String mesage) { this.excmple = mesage; } public String Calc(String excmple) { this.excmple = excmple; Calculate test = new Calculate(); String num1 = "",num2 = ""; char op='1'; if(excmple.indexOf('+') != -1) {// 寻找字符号,找到返回位置,未找到返回-1 op = '+'; num1 = excmple.substring(0,excmple.indexOf('+'));//取中间文本(0位置到字符号位置) num2 = excmple.substring(excmple.indexOf('+')+1,excmple.length()); }else if(excmple.indexOf('-') != -1) {// 寻找字符号,找到返回位置,未找到返回-1 op = '-'; num1 = excmple.substring(0,excmple.indexOf('-')); num2 = excmple.substring(excmple.indexOf('-')+1,excmple.length()); }else if(excmple.indexOf('*') != -1) {// 寻找字符号,找到返回位置,未找到返回-1 op = '*'; num1 = excmple.substring(0,excmple.indexOf('*')); num2 = excmple.substring(excmple.indexOf('*')+1,excmple.length()); }else if(excmple.indexOf('/') != -1) {// 寻找字符号,找到返回位置,未找到返回-1 op = '/'; num1 = excmple.substring(0,excmple.indexOf('/')); num2 = excmple.substring(excmple.indexOf('/')+1,excmple.length()); } result = test.cal(Float.parseFloat(num1),Float.parseFloat(num2),op); return (Float.toString(result)); } } import java.util.Scanner; public class SuperCalc { //复杂表达式的计算,同上简易,只是加了括号的位置寻找和判定 Scanner sc = new Scanner(System.in); String mesage; float result; int right,left; public SuperCalc(String mesage) { this.mesage = mesage; left = mesage.indexOf('('); right = mesage.indexOf(')'); } public String Calc() { Calculate test = new Calculate(); String excmple,num1 = "",num2 = ""; char op='1'; excmple = mesage.substring(left+1,right); if(excmple.indexOf('+') != -1) { op = '+'; num1 = excmple.substring(0,excmple.indexOf('+')); num2 = excmple.substring(excmple.indexOf('+')+1,excmple.length()); }else if(excmple.indexOf('-') != -1) { op = '-'; num1 = excmple.substring(0,excmple.indexOf('-')); num2 = excmple.substring(excmple.indexOf('-')+1,excmple.length()); }else if(excmple.indexOf('*') != -1) { op = '*'; num1 = excmple.substring(0,excmple.indexOf('*')); num2 = excmple.substring(excmple.indexOf('*')+1,excmple.length()); }else if(excmple.indexOf('/') != -1) { op = '/'; num1 = excmple.substring(0,excmple.indexOf('/')); num2 = excmple.substring(excmple.indexOf('/')+1,excmple.length()); } result = test.cal(Float.parseFloat(num1),Float.parseFloat(num2),op); return (Float.toString(result)); } } //测试类 import java.util.Scanner; // 1913040238 杨wy public class TestCalculate { public static void main(String[] args) { Scanner sc = new Scanner(System.in); Calculate test = new Calculate(); String num1="22",num2="33",num; // 初始化赋值,不影响后续 char op = '+'; // 初始化赋值,不影响后续 String excmple; System.out.println("请输入表达式:"); excmple = sc.next(); if(excmple.indexOf('(') != -1) { // 如果括号存在 SuperCalc test1 = new SuperCalc(excmple); // 建立括号对象 num = test1.Calc(); //括号结果 if(test1.left == 0) { excmple = num + excmple.substring(test1.right+1,excmple.length()) ; }else if (test1.right == excmple.length()-1) { excmple = excmple.substring(0,test1.left) + num; } if(excmple.indexOf('+') != -1) { op = '+'; num1 = excmple.substring(0,excmple.indexOf('+')); num2 = excmple.substring(excmple.indexOf('+')+1,excmple.length()); }else if(excmple.indexOf('-') != -1) { op = '-'; num1 = excmple.substring(0,excmple.indexOf('-')); num2 = excmple.substring(excmple.indexOf('-')+1,excmple.length()); }else if(excmple.indexOf('*') != -1) { op = '*'; num1 = excmple.substring(0,excmple.indexOf('*')); num2 = excmple.substring(excmple.indexOf('*')+1,excmple.length()); }else if(excmple.indexOf('/') != -1) { op = '/'; num1 = excmple.substring(0,excmple.indexOf('/')); num2 = excmple.substring(excmple.indexOf('/')+1,excmple.length()); } System.out.print("结果是:" + test.cal(Float.parseFloat(num1),Float.parseFloat(num2),op)); } else { SimpleCalc SimC = new SimpleCalc(excmple); System.out.println("结果是:" + SimC.Calc(excmple)); } } }