RosettaCodeData/Task/Parsing-RPN-calculator-algorithm/R/parsing-rpn-calculator-algorithm.r
2026-04-30 12:34:36 -04:00

36 lines
975 B
R

rpn <- function(s) {
stack <- list()
ops <- strsplit(s, " ")[[1]]
for (op in ops) {
if (op %in% c("+", "-", "*", "/", "^")) {
arg2 <- stack[[length(stack)]]
arg1 <- stack[[length(stack) - 1]]
stack <- stack[-c(length(stack), length(stack) - 1)]
if (op == "+") {
res <- as.numeric(arg1) + as.numeric(arg2)
} else if (op == "-") {
res <- as.numeric(arg1) - as.numeric(arg2)
} else if (op == "*") {
res <- as.numeric(arg1) * as.numeric(arg2)
} else if (op == "/") {
res <- as.numeric(arg1) / as.numeric(arg2)
} else if (op == "^") {
res <- as.numeric(arg1) ^ as.numeric(arg2)
}
stack <- c(stack, res)
} else {
stack <- c(stack, as.numeric(op))
}
cat(op, ": ", paste(stack, collapse = ", "), "\n", sep = "")
}
if (length(stack) != 1) {
stop(paste("invalid RPN expression:", s))
}
return(stack[[1]])
}
rpn("3 4 2 * 1 5 - 2 3 ^ ^ / +")