<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 0150. 逆波蘭表達式求值 ## 題目地址(150. 逆波蘭表達式求值) <https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/> ## 題目描述 ``` <pre class="calibre18">``` 根據 逆波蘭表示法,求表達式的值。 有效的運算符包括 +, -, *, / 。每個運算對象可以是整數,也可以是另一個逆波蘭表達式。 說明: 整數除法只保留整數部分。 給定逆波蘭表達式總是有效的。換句話說,表達式總會得出有效數值且不存在除數為 0 的情況。 示例 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 逆波蘭表達式: 逆波蘭表達式是一種后綴表達式,所謂后綴就是指算符寫在后面。 平常使用的算式則是一種中綴表達式,如 ( 1 + 2 ) * ( 3 + 4 ) 。 該算式的逆波蘭表達式寫法為 ( ( 1 2 + ) ( 3 4 + ) * ) 。 逆波蘭表達式主要有以下兩個優點: 去掉括號后表達式無歧義,上式即便寫成 1 2 + 3 4 + * 也可以依據次序計算出正確結果。 適合用棧操作運算:遇到數字則入棧;遇到算符則取出棧頂兩個數字進行計算,并將結果壓入棧中。 ``` ``` ## 前置知識 - 棧 ## 公司 - 阿里 - 騰訊 ## 思路 逆波蘭表達式又叫做后綴表達式。在通常的表達式中,二元運算符總是置于與之相關的兩個運算對象之間,這種表示法也稱為`中綴表示`。 波蘭邏輯學家J.Lukasiewicz于1929年提出了另一種表示表達式的方法,按此方法,每一運算符都置于其運算對象之后,故稱為`后綴表示`。 > 逆波蘭表達式是一種十分有用的表達式,它將復雜表達式轉換為可以依靠簡單的操作得到計算結果的表達式。例如(a+b)*(c+d)轉換為ab+cd+* ## 關鍵點 1. 棧的基本用法 2. 如果你用的是JS的話,需要注意/ 和 其他很多語言是不一樣的 3. 如果你用的是JS的話,需要先將字符串轉化為數字。否則有很多意想不到的結果 4. 操作符的順序應該是 先出棧的是第二位,后出棧的是第一位。 這在不符合交換律的操作中很重要, 比如減法和除法。 ## 代碼 ``` <pre class="calibre18">``` <span class="hljs-title">/** * @param {string[]} tokens * @return {number} */</span> <span class="hljs-keyword">var</span> evalRPN = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">tokens</span>) </span>{ <span class="hljs-title">// 這種算法的前提是 tokens是有效的,</span> <span class="hljs-title">// 當然這由算法來保證</span> <span class="hljs-keyword">const</span> stack = []; <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> index = <span class="hljs-params">0</span>; index < tokens.length; index++) { <span class="hljs-keyword">const</span> token = tokens[index]; <span class="hljs-title">// 對于運算數, 我們直接入棧</span> <span class="hljs-keyword">if</span> (!<span class="hljs-params">Number</span>.isNaN(<span class="hljs-params">Number</span>(token))) { stack.push(token); } <span class="hljs-keyword">else</span> { <span class="hljs-title">// 遇到操作符,我們直接大膽運算,不用考慮算術優先級</span> <span class="hljs-title">// 然后將運算結果入棧即可</span> <span class="hljs-title">// 當然如果題目進一步擴展,允許使用單目等其他運算符,我們的算法需要做微小的調整</span> <span class="hljs-keyword">const</span> a = <span class="hljs-params">Number</span>(stack.pop()); <span class="hljs-keyword">const</span> b = <span class="hljs-params">Number</span>(stack.pop()); <span class="hljs-keyword">if</span> (token === <span class="hljs-string">"*"</span>) { stack.push(b * a); } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (token === <span class="hljs-string">"/"</span>) { stack.push(b / a >> <span class="hljs-params">0</span>); } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (token === <span class="hljs-string">"+"</span>) { stack.push(b + a); } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (token === <span class="hljs-string">"-"</span>) { stack.push(b - a); } } } <span class="hljs-keyword">return</span> stack.pop(); }; ``` ``` ## 擴展 逆波蘭表達式中只改變運算符的順序,并不會改變操作數的相對順序,這是一個重要的性質。 另外逆波蘭表達式完全不關心操作符的優先級,這在中綴表達式中是做不到的,這很有趣,感興趣的可以私下查找資料研究下為什么會這樣。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看