注意:
下面代码都是用kotlin代码开发,其实跟java语言开发差不多,算法思路是一样。
该算法只能对加、减、乘、除进行基本运算,对复杂等式不能计算,记住,不要等一下说博主坑你们。
一、把字符串等式转化为子字符串
首先,把字符串转换为字符数组,并对每一个字符进行判断,该字符是数字,设置一个变量,来存储数字,当下一个字符是运算符,先判断存储数字变量中是否为空,如果不为空,就把该变量数据添加到字符串集合中,并把字符也进行存储,详细代码如下:
private fun countNum(result: String): Int {
val numArray: CharArray = result.toCharArray()
val m = ArrayList<String>()
var num: String = ""
for (n in 0..numArray.size - 1) {
val char = numArray[n].toString()
when (char) {
"-", "+", "*", "/" -> {
if (!num.isEmpty()) {
m.add(num)
num = ""
}
num += char
m.add(num)
num = ""
}
else -> {
num += char
if (n == numArray.size - 1) {
m.add(num)
}
}
}
}
return num(m)
}
二、对等式进行运算。
通过集合中数据获取乘、除运算符号个数,并通过一个变量存储以来,计算个数方便到时候循环计算乘、除次数,接下来进行计算,遍历集合中数据,进行计算运算符号前一个数字和后一个数字,并存储到集合中,移除参加运算数据。
先计算乘除,再计算加减
private fun num(number: ArrayList<String>): Int {
var one: Float
var two: Float
var result: Float = 0f
var count: Int = 0
var total:Int=0
var flag:Int=0
//计算出有乘除个数
(0..number.size - 1)
.filter { number[it] == "*" || number[it] == "/" }
.forEach { count += 1 }
for (m in 0..count) {
loop@ for (n in 0..number.size - 2) {
val m = number[n]
when (m) {
"*", "/" -> {
one = number[n - 1].toFloat()
two = number[n + 1].toFloat()
if ("*" == m) {
result = one * two
} else if ("/" == m) {
result = one / two
}
number[n] = result.toString()
number.removeAt(n + 1)
number.removeAt(n - 1)
break@loop
}
}
}
}
System.out.println("数据1"+number.toString())
for(m in 0..number.size-1){
val n = number[m]
when(n){
"+","-" ->{
if ("+" == n) {
flag=0
} else if ("-" == n) {
flag=1
}
}
else ->{
if(flag==0){
System.out.println(number[m].toFloat().toInt())
total += number[m].toFloat().toInt()
}else if(flag==1){
total -= number[m].toFloat().toInt()
}
}
}
}
System.out.println("数据2"+number.toString())
return total
}