kotlin实现计算器
时间: 2023-09-13 11:05:57 浏览: 52
下面是一个简单的 Kotlin 计算器示例代码:
```kotlin
fun main() {
println("请输入计算表达式:")
val input = readLine()
if (input == null || input.isEmpty()) {
println("表达式为空!")
} else {
try {
val result = calculate(input)
println("计算结果为:$result")
} catch (e: Exception) {
println("计算出错:${e.message}")
}
}
}
fun calculate(input: String): Double {
val tokens = tokenize(input)
val postfix = toPostfix(tokens)
return evaluate(postfix)
}
fun tokenize(input: String): List<String> {
val regex = """(\d+(\.\d+)?)|([+\-*/()])""".toRegex()
return regex.findAll(input).map { it.value }.toList()
}
fun toPostfix(tokens: List<String>): List<String> {
val result = mutableListOf<String>()
val stack = mutableListOf<String>()
for (token in tokens) {
when (token) {
"+" -> {
while (!stack.isEmpty() && stack.last() != "(") {
result.add(stack.removeLast())
}
stack.add(token)
}
"-" -> {
while (!stack.isEmpty() && stack.last() != "(") {
result.add(stack.removeLast())
}
stack.add(token)
}
"*" -> {
while (!stack.isEmpty() && (stack.last() == "*" || stack.last() == "/")) {
result.add(stack.removeLast())
}
stack.add(token)
}
"/" -> {
while (!stack.isEmpty() && (stack.last() == "*" || stack.last() == "/")) {
result.add(stack.removeLast())
}
stack.add(token)
}
"(" -> {
stack.add(token)
}
")" -> {
while (!stack.isEmpty() && stack.last() != "(") {
result.add(stack.removeLast())
}
if (stack.isEmpty()) {
throw IllegalArgumentException("括号不匹配!")
}
stack.removeLast()
}
else -> {
result.add(token)
}
}
}
while (!stack.isEmpty()) {
val top = stack.removeLast()
if (top == "(") {
throw IllegalArgumentException("括号不匹配!")
}
result.add(top)
}
return result
}
fun evaluate(postfix: List<String>): Double {
val stack = mutableListOf<Double>()
for (token in postfix) {
when (token) {
"+" -> {
val b = stack.removeLast()
val a = stack.removeLast()
stack.add(a + b)
}
"-" -> {
val b = stack.removeLast()
val a = stack.removeLast()
stack.add(a - b)
}
"*" -> {
val b = stack.removeLast()
val a = stack.removeLast()
stack.add(a * b)
}
"/" -> {
val b = stack.removeLast()
val a = stack.removeLast()
stack.add(a / b)
}
else -> {
val value = token.toDoubleOrNull()
if (value == null) {
throw IllegalArgumentException("非法数字:$token")
}
stack.add(value)
}
}
}
if (stack.size != 1) {
throw IllegalArgumentException("表达式不正确!")
}
return stack.first()
}
```
该计算器实现了四则运算,支持括号。用户输入表达式后,程序会将表达式转化为后缀表达式,然后计算出结果并输出。