https://coderun.yandex.ru/problem/postfix-entry/description Легкая

Условие

В постфиксной записи (или обратной польской записи) операция записывается после двух операндов. Например, сумма двух чисел A и B записывается как A B +. Запись B C + D * обозначает привычное нам (B + C) * D, а запись A B C + D * + означает A + (B + C) * D. Достоинство постфиксной записи в том, что она не требует скобок и дополнительных соглашений о приоритете операторов для своего чтения.

Примеры

Ввод: 8 9 + 1 7 - * Вывод: -102

Решение

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.util.Stack

fun main() {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))

    // Считываем выражение в постфиксной записи и разбиваем на токены
    val tokens = reader.readLine().trim().split(" ")
    val stack = Stack<Int>()

    for (token in tokens) {
        when (token) {
            // Если токен - оператор, выполняем операцию над двумя последними элементами стека
            "+", "-", "*" -> {
                val b = stack.pop()
                val a = stack.pop()
                stack.push(
                    when (token) {
                        "+" -> a + b
                        "-" -> a - b
                        else -> a * b
                    }
                )
            }
            // Если токен - число, добавляем его в стек
            else -> stack.push(token.toInt())
        }
    }

    // Выводим результат вычисления
    writer.write(stack.pop().toString())

    reader.close()
    writer.close()
}