Курс языка программирования Raku / Приложение 🆕 / Собираем всё вместе / Смешанные мини-проекты / Exercises / Калькулятор обратной польской записи

Решение: Калькулятор обратной польской записи

Вот один из возможных вариантов решения задачи.

Код

my $expression = '3 4 + 5 *';
my @stack;

for $expression.words -> $token {
    if $token ~~ / ^ \d+ $ / {
        @stack.push($token.Int);
    }
    else {
        my $b = @stack.pop;
        my $a = @stack.pop;
        @stack.push( do given $token {
            when '+' { $a + $b }
            when '-' { $a - $b }
            when '*' { $a * $b }
            when '/' { $a / $b }
        });
    }
}

say @stack[0];

🦋 Исходный код можно найти в файле rpn-calculator.raku.

Вывод

35

Комментарии

  1. Числа кладутся на стек. Оператор снимает два последних значения, объединяет их и кладёт результат обратно — в этом и состоит суть постфиксного вычисления.

  2. do given $token превращает оператор в нужное арифметическое действие, а порядок сперва $a, затем $b (снятые в обратном порядке) сохраняет правильное направление вычитания и деления.

Навигация по курсу

Калькулятор обратной польской записи   |   Текстовая гистограмма