摘要:題目根據逆波蘭表示法,求表達式的值。給定逆波蘭表達式總是有效的。逆波蘭表達式又叫做后綴表達式。解題思路可以看出逆波蘭表達式中的每一個運算符屬于該運算符前的兩個數字間的運算。如如波蘭表達式則加號前兩個數字為。
題目:
根據逆波蘭表示法,求表達式的值。
有效的運算符包括 +, -, *, / 。每個運算對象可以是整數,也可以是另一個逆波蘭表達式。
Evaluate the value of an arithmetic expression in Reverse Polish Notation.
Valid operators are +, -, *, /. Each operand may be an integer or another expression.
說明:
整數除法只保留整數部分。
給定逆波蘭表達式總是有效的。換句話說,表達式總會得出有效數值且不存在除數為 0 的情況。
Note:
Division between two integers should truncate toward zero.
The given RPN expression is always valid. That means the expression would always evaluate to a result and there won"t be any divide by zero operation.
示例 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 / ((9 + 3) * -11))) + 17) + 5 = ((10 * (6 / (12 * -11))) + 17) + 5 = ((10 * (6 / -132)) + 17) + 5 = ((10 * 0) + 17) + 5 = (0 + 17) + 5 = 17 + 5 = 22擴展:
逆波蘭表達式,它的語法規定,表達式必須以逆波蘭表達式的方式給出。逆波蘭表達式又叫做后綴表達式。這個知識點在數據結構和編譯原理這兩門課程中都有介紹,下面是一些例子:
a+b ---> a,b,+ a+(b-c) ---> a,b,c,-,+ a+(b-c)*d ---> a,b,c,-,d,*,+ a+d*(b-c)--->a,d,b,c,-,*,+ a=1+3 ---> a,1,3,+,=
從上面的例子可以看出:
(1) 在兩種表示中,運算對象出現的順序相同;
(2) 在后綴表示中,運算符按實際計算順序從左到右排列,且每一運算符總是跟在其運算對象之后。
這種表達式很反人類,但是對計算機很友好,因為計算機運算是利用棧數據結構。
解題思路:可以看出逆波蘭表達式中的每一個運算符屬于該運算符前的兩個數字間的運算。如:
如波蘭表達式:1,2,+ 則加號前兩個數字為1,2。其運算符就是加號:1+2 得出結果:1+2=3 如波蘭表達式:1,2,3,+,- 則加號前兩個數字為2,3。其運算符就是加號:2+3 得出結果2+3=5,則波蘭表達式變為:1,5,- 減號前兩個數字為1,5,其運算符就是減號:1-5 得出結果1-5=-4
由上面的的例子思路就很清晰了,直接用指針遍歷表達式,遇到數字就入棧,遇到運算符就彈出兩個數字,把他們運算之后得出結果,再作為獨立數字入棧。最后棧內只剩一個元素 即表達式運算結果。也可以用遞歸
Java:class Solution { public int evalRPN(String[] tokens) { StackPython:stack = new Stack<>(); for (String t : tokens) { if (t.equals("+")) { stack.push(stack.pop() + stack.pop()); } else if (t.equals("-")) { int tmp = stack.pop(); stack.push(stack.pop() - tmp); } else if (t.equals("*")) { int tmp = stack.pop(); stack.push(stack.pop() * tmp); } else if (t.equals("/")) { int tmp = stack.pop(); stack.push(stack.pop() / tmp); } else { stack.push(Integer.parseInt(t)); } } return stack.pop(); } }
python也可以用數組代替棧完成上述方法解答本題。這里用另一個函數 eval() 代替上述四個 if 判斷:
class Solution: def evalRPN(self, tokens: List[str]) -> int: stack = [] for t in tokens: if t in "+-*/": tmp = stack.pop() stack.append(int(eval("stack.pop()" + t + "tmp"))) else: stack.append(int(t)) return stack.pop()
eval() 函數可以執行傳入參數 字符串語句。
如 eval("print("hhhhh")") 會執行參數字符串打印出hhhhh
歡迎大家關注微.信公.眾號:愛寫Bug
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/75814.html
摘要:小鹿題目根據逆波蘭表示法,求表達式的值。給定逆波蘭表達式總是有效的。算法思路仔細觀察上述的逆波蘭表達式,可以發現一個規律就是每遇到一個操作符,就將操作符前的兩個操作數進行運算,將結果保存到原位置。 Time:2019/4/14Title: Evaluate Reverse Polish NotationDifficulty: MediumAuthor:小鹿 題目:Evaluate ...
摘要:棧法復雜度時間空間思路逆波蘭表達式的計算十分方便,對于運算符,其運算的兩個數就是這個運算符前面的兩個數。注意對于減法,先彈出的是減號后面的數。 Evaluate Reverse Polish Notation Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operato...
摘要:我們一般看到的數學表達式就是中綴表達式,也就是將符號放在兩個數字之間。后綴表達式也就是將運算符放在相應數字的后面。后綴表達式相當于樹中的后序遍歷。通過獲得對應位置的操作符。如果對應的還是操作符,則繼續遞歸往前計算。 題目要求 Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid...
Problem Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, *, /. Each operand may be an integer or another expression. Note: Division between two inte...
閱讀 2909·2021-11-15 11:39
閱讀 1529·2021-08-19 10:56
閱讀 1101·2019-08-30 14:12
閱讀 3750·2019-08-29 17:29
閱讀 727·2019-08-29 16:21
閱讀 3428·2019-08-26 12:22
閱讀 1524·2019-08-23 16:30
閱讀 1031·2019-08-23 15:25