Я определил в haskell следующую функцию:
step :: [Int] -> [Char] -> [Int]
step stack str
| str == "*" = remaining ++ [x*y]
| str == "+" = remaining ++ [x+y]
| str == "-" = remaining ++ [x-y]
| str == "/" = remaining ++ [x `div` y]
| otherwise = stack ++ [read str :: Int]
where x = (last . init) stack
y = (last stack)
remaining = (init . init) stack
Эта функция принимает целочисленный массив [10, 4, 3]
и строковый оператор *
, применяет оператор к последним двум элементам в массиве и возвращает следующий массив [10, 7]
.
Это часть промежуточной функции, конечный результат - функция оценщика с обратной полировкой.
Как я могу использовать step
функцию, которую я определил, и foldl
для выполнения следующих действий:
Возьмите строку примера: "10 4 3 + 2 * -"
.
Добавляйте каждый элемент в строку, пока не встретится первый оператор:
10, 4, 3
Затем примените оператор к двум элементам на вершине стека и поместите результат в стек:
10, 7
.
Продолжайте до тех пор, пока не будет оценен окончательный ответ (-4
)
Ответ:
Для полноты картины я пришел к этой функции с помощью @talex.
rpn :: String -> Int
rpn input = head result
where arr = words input
result = foldl step [] arr
step
функция по сутиfoldr
- person Denis Babochenko   schedule 03.01.2019empty = []; top = head; push = (:); pop = tail
. Все это O (1).last
,init
и(++)
не являются примитивными операциями, все они O (N). - person n. 1.8e9-where's-my-share m.   schedule 03.01.2019x
,y
иremaining
без необходимости использования предложенияwhere
:step (x:y:remaining) "*" = x*y : remaining
и т. Д. - person chepner   schedule 04.01.2019