逆ポーランド記法での算術式の値を評価します。
有効な演算子は+です、 - 、*、/。各オペランドは整数または別の表現であってもよいです。
注意:
二つの整数間の部門はゼロに向かって切り捨てる必要があります。
与えられたRPN式は常に有効です。手段という表現は、常に結果を評価するだろうし、ゼロ操作によって任意の格差がありません。
例1:
入力:[「2」、「1」、「+」、「3」、「*」]
出力:9
説明:((2 + 1)* 3)= 9
例2:
入力:[「4」、「13」、「5」、「/」、「+」]
出力:6
説明:(4 +(13/5))= 6
実施例3:
入力:[「10」、「6」、「9」、「3」、「+」、「-11」、「"『/』、"」、 『17』、 『+』、 『5』、 「+」]
出力:22
説明:
((10 *(6 + 3 /((9)* -11)))+ 17)+ 5
=((10 *(6 * -11 /(12)))+ 17)+ 5
=((10 * / -132(6))+ 17)+ 5
=((10×0)+ 17)+ 5
=(0 + 17)+ 5
= 17 + 5
= 22
func evalRPN(tokens []string) int {
stack := []int{}
for _, v := range tokens {
if val, err := strconv.Atoi(v); err == nil {
stack = append(stack, val)
} else {
if len(stack) < 2 {
return 0
}
n1, n2 := stack[len(stack)-2], stack[len(stack)-1]
fmt.Println(n1,n2,v)
stack = stack[:len(stack)-2]
n := 0
switch v {
case "+":
n += n1 + n2
case "-":
n += n1 - n2
case "*":
n += n1 * n2
case "/":
n += n1 / n2
default:
return 0
}
stack = append(stack, n)
}
}
return stack[len(stack)-1]
}