코틀린으로 반폴란드법을 만든 파사

11588 단어 Kotlintech

개시하다


뭐라도 쓰고 싶은데 쓰는 방법이 아무것도 없네
요컨대 최근에 한 일을 먼저 써라

하고 싶은 일

10 5 + 2 * sin출력이 0.5가 되면 오케이!

반폴란드법


1 + 2 -> 1 2 +
기호를 안에 쓰는 것이 아니라 뒤에 쓰다
이름의 유래는 이전에 쓴 폴란드법과 상반된다
()가 필요하지 않기 때문에 파티를 하는 것이 비교적 수월하다
단, 구분자 필요
옛날에 계산기가 가끔 있었던 것 같아요.
어려울 것 같으니까 일본어 읽어주세요.10 5 + 2 * sin
10과 5를 합친 물건, 2로 합친 물건의sin.

sin((10 + 5)*2)

코드


fun main(){
    println(parse("10 5 + 2 * sin".split(" ")))
}
fun parse(rpn: List<String>): Double {
    val stack: Deque<Double> = ArrayDeque()
    rpn.forEach {
        if(it.toDoubleOrNull() != null){
            stack.push(it.toDouble())
        }else{
            val a = stack.pop()
            val b by lazy { stack.pop() }
            when (it) {
                "+" -> stack.push(b + a)
                "-" -> stack.push(b - a)
                "*" -> stack.push(b * a)
                "/" -> stack.push(b / a)
                "sin" -> stack.push(sin(Math.toRadians(a)))
            }
        }
    }
    return stack.pop()
}

해설


공백으로 구분하여 각 요소를parse 함수에 건네주기
fun main(){
    println(parse("10 5 + 2 * sin".split(" ")))
}
소위 Deque List 같은 놈은 요소만 꺼내면 언제 사라질까
val stack: Deque<Double> = ArrayDeque()
회전rpn:List, 숫자는stack에 저장
rpn.forEach {
    if(it.toDoubleOrNull() != null){
        stack.push(it.toDouble())
    }
함수(+,* 등)는 반드시 하나 이상의 값을 취해야 하지만 두 개에 국한되지 않는다
bylazy {} 변수를 사용할 때만 값을 가져옵니다
val a = stack.pop()
val b by lazy { stack.pop() }
별다른 뜻은 없지만.../넣어도
그 다음은 a입니다. 넣는 순서가 a-&b이기 때문에 꺼내서 사용할 때는 반드시 b->a가 필요합니다.
다음 계산에 계산 결과를 사용합니다
when (it) {
    "+" -> stack.push(b + a)
    "-" -> stack.push(b - a)
    "*" -> stack.push(b * a)
    "/" -> stack.push(b / a)
    "sin" -> stack.push(sin(Math.toRadians(a)))
}
마지막 남은 값을 되돌려줍니다
return stack.pop()

결실


0.49999999999999994
어쩔 수 없어!

좋은 웹페이지 즐겨찾기