36 lines
975 B
R
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 ^ ^ / +")
|