코틀린으로 반폴란드법을 만든 파사
개시하다
뭐라도 쓰고 싶은데 쓰는 방법이 아무것도 없네
요컨대 최근에 한 일을 먼저 써라
하고 싶은 일
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:Listrpn.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
어쩔 수 없어!
Reference
이 문제에 관하여(코틀린으로 반폴란드법을 만든 파사), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/yuuki2028/articles/5890438fda3c93b2fc0d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)