
Evaluate Reverse Polish Notation
Evaluate the value of an arithmetic expression in Reverse Polish Notation.
Valid operators are +, -, *, /. Each operand may be an integer or another expression.
For examples:
| 1 2
 | ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
 | 
Default:
| 1 2 3
 | func evalRPN(tokens []string) int { }
 | 
解答思路:
這題要你將已經被逆波蘭表示法拆解的算式還原回去並計算結果,而RPN其實就是資料結構所提到堆疊運用的四則運算後置式(運算子在後頭),最困難的部分都已經拆解好要再還原算式以計算結果就非常容易,遍歷已拆解的算式,只要碰到運算元就放入stack之中,碰到運算子才從stack中取出兩個運算元做計算,並再將得到的結果再次放回stack,最後遍歷結束後在stack中唯一一個剩下的運算元就是我們要的結果。
程式碼解說:
因為stack是採用LinkedList的方式實作,所以一開始就先定義好節點的結構,包含其值與下一個節點的位置
| 1 2 3 4
 | type Node struct { 	Val  int 	Next *Node }
 | 
接著就開始還原算式並計算結果,一開始先遍歷已拆解的字串,碰到運算子就從stack中取出兩個運算元做計算(第一個取出的運算元在運算子後面,第二個在前面),並根據運算子的符號做對應的計算,再將計算結果包成stack的頭節點再次放回stack之中,而如果是碰到運算元則直接包裝成頭節點放入stack之中(記得要將字串轉成數字,後續取出才可以拿來計算),最後遍歷結束後在stack中唯一一個剩下的運算元(也就是頭節點)就是我們要的結果。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
 | func evalRPN(tokens []string) int { 	var tmp int 	var numFront int 	var numBack int 	var top *Node 	var newNode *Node 	for _, v := range tokens { 		if v == "+" || v == "-" || v == "*" || v == "/" { 			numBack = top.Val 			top = top.Next 			numFront = top.Val 			top = top.Next 			switch v { 			case "+": 				tmp = numFront + numBack 			case "-": 				tmp = numFront - numBack 			case "*": 				tmp = numFront * numBack 			case "/": 				tmp = numFront / numBack 			} 			newNode = &Node{tmp, top} 			top = newNode 		} else { 			val, _ := strconv.Atoi(v) 			newNode = &Node{val, top} 			top = newNode 		} 	} 	return top.Val }
 | 
完整程式碼:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
 | type Node struct { 	Val  int 	Next *Node } func evalRPN(tokens []string) int { 	var tmp int 	var numFront int 	var numBack int 	var top *Node 	var newNode *Node 	for _, v := range tokens { 		if v == "+" || v == "-" || v == "*" || v == "/" { 			numBack = top.Val 			top = top.Next 			numFront = top.Val 			top = top.Next 			switch v { 			case "+": 				tmp = numFront + numBack 			case "-": 				tmp = numFront - numBack 			case "*": 				tmp = numFront * numBack 			case "/": 				tmp = numFront / numBack 			} 			newNode = &Node{tmp, top} 			top = newNode 		} else { 			val, _ := strconv.Atoi(v) 			newNode = &Node{val, top} 			top = newNode 		} 	} 	return top.Val }
 | 
總結:
要將已經被RPN逆波蘭表示法拆解的算式還原回去並計算結果,只要遍歷已拆解的算式,只要碰到運算元就放入stack之中,碰到運算子才從stack中取出兩個運算元做計算,並再將得到的結果再次放回stack,最後遍歷結束後在stack中唯一一個剩下的運算元就是我們要的結果。