#include <stdlib.h>
#include <string.h>
int evalRPN(char **tokens, int tokensSize) {
int *st = malloc(tokensSize * sizeof(int));
int top = 0;
for (int i = 0; i < tokensSize; i++) {
char *s = tokens[i];
// a lone operator char; "-11" is a number, so check the length too
if (strlen(s) == 1 && strchr("+-*/", s[0])) {
int b = st[--top];
int a = st[--top];
if (s[0] == '+')
st[top++] = a + b;
else if (s[0] == '-')
st[top++] = a - b;
else if (s[0] == '*')
st[top++] = a * b;
else
st[top++] = a / b;
} else {
st[top++] = atoi(s);
}
}
int result = st[top - 1];
free(st);
return result;
}
#include <stack>
#include <string>
#include <vector>
using namespace std;
class Solution {
public:
int evalRPN(vector<string> &tokens) {
stack<int> st;
for (string s : tokens) {
if (s == "+" || s == "-" || s == "*" || s == "/") {
int b = st.top();
st.pop();
int a = st.top();
st.pop();
if (s == "+")
st.push(a + b);
else if (s == "-")
st.push(a - b);
else if (s == "*")
st.push(a * b);
else
st.push(a / b);
} else {
st.push(stoi(s));
}
}
return st.top();
}
};
package main
import "strconv"
func evalRPN(tokens []string) int {
st := []int{}
for _, s := range tokens {
if s == "+" || s == "-" || s == "*" || s == "/" {
n := len(st)
a, b := st[n-2], st[n-1]
st = st[:n-2]
switch s {
case "+":
st = append(st, a+b)
case "-":
st = append(st, a-b)
case "*":
st = append(st, a*b)
default:
st = append(st, a/b)
}
} else {
v, _ := strconv.Atoi(s)
st = append(st, v)
}
}
return st[len(st)-1]
}
import java.util.ArrayDeque;
import java.util.Deque;
class Solution {
public int evalRPN(String[] tokens) {
Deque<Integer> st = new ArrayDeque<>();
for (String s : tokens) {
if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")) {
int b = st.pop();
int a = st.pop();
if (s.equals("+"))
st.push(a + b);
else if (s.equals("-"))
st.push(a - b);
else if (s.equals("*"))
st.push(a * b);
else
st.push(a / b);
} else {
st.push(Integer.parseInt(s));
}
}
return st.peek();
}
}
class Solution {
evalRPN(tokens) {
const st = [];
for (const s of tokens) {
if (s === "+" || s === "-" || s === "*" || s === "/") {
const b = st.pop();
const a = st.pop();
if (s === "+") st.push(a + b);
else if (s === "-") st.push(a - b);
else if (s === "*") st.push(a * b);
else st.push(Math.trunc(a / b));
} else {
st.push(parseInt(s, 10));
}
}
return st.at(-1);
}
}
from typing import List
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
st = []
for s in tokens:
if s in ("+", "-", "*", "/"):
b = st.pop()
a = st.pop()
if s == "+":
st.append(a + b)
elif s == "-":
st.append(a - b)
elif s == "*":
st.append(a * b)
else:
st.append(int(a / b)) # truncate toward zero, not floor
else:
st.append(int(s))
return st[-1]
struct Solution;
impl Solution {
fn eval_rpn(tokens: Vec<String>) -> i32 {
let mut st: Vec<i32> = Vec::new();
for s in &tokens {
if matches!(s.as_str(), "+" | "-" | "*" | "/") {
let b = st.pop().unwrap();
let a = st.pop().unwrap();
st.push(match s.as_str() {
"+" => a + b,
"-" => a - b,
"*" => a * b,
_ => a / b,
});
} else {
st.push(s.parse().unwrap());
}
}
*st.last().unwrap()
}
}