リバースポリッシュとは何ですか?

1. 逆ポリッシュとは何ですか?

逆ポーランド記法 (RPN) とも呼ばれる逆ポーランド記法は、数学およびコンピューター サイエンスで算術式を表すために使用される方法です。その特徴は、演算子がオペランドの後ろにあり、演算の優先順位を変更するための括弧が必要ないことです。

たとえば、私たちが普段書く算術式は「2 + 3」です。逆ポーランド記法では、この式は「2 3 +」と書かれます。

逆ポーランド記法の主な利点は、式の中のかっこが排除され、演算の実行順序がより明確になることです。コンピューター サイエンスでは、逆ポーランド記法を使用すると、式をより簡単かつ効率的に評価できます。たとえば、スタック データ構造を使用すると、逆ポーランド式を簡単に計算できます。

逆ポーランド記法は、ポーランドの論理学者ヤン・ウカシェヴィチにちなんで命名されました。彼のオリジナルの「ポーランド語表記」では演算子がオペランドの前に配置されますが (「+ 2 3」など)、「逆ポーランド語表記」では演算子がオペランドの後に配置され、実際に、特にコンピュータ サイエンスで使用されやすくなります。

逆ポーランド記法 (RPN) の例をいくつか見てみましょう。以下に、一般的な算術式とそれに対応する逆ポーランド語の表現をいくつか示します。

正規表現: (7 - 4) * 2、対応する RPN 表現: 7 4 - 2 *

説明: まず 7 から 4 を引いて、その結果に 2 を掛けます。

正規表現: 5 + ((1 + 2) * 4) - 3、対応する RPN 表現: 5 1 2 + 4 * + 3 -

説明: まず 1+2 を実行し、次にその結果に 4 を掛け、次に 5 を加算し、最後にその結果から 3 を引きます。

正規表現: (3 + 4) * (5 * 6)、対応する RPN 表現: 3 4 + 5 6 * *

説明: 3+4 が最初に実行され、5*6 が同時に実行され、次に 2 つの結果が乗算されます。

2. 逆ポーランド式に従って計算します。

これは、Java で実装された逆ポーランド語 (RPN) 計算機の簡単な例です。この計算機は、基本的な四則演算からなる RPN 式を処理できます。

import java.util.Stack;
 
public class RPNCalculator {
    
    
    public static int evalRPN(String[] tokens) {
    
    
        Stack<Integer> stack = new Stack<>();
 
        for (String token : tokens) {
    
    
            switch (token) {
    
    
                case "+":   //但是符号时,就进行运算
                    stack.push(stack.pop() + stack.pop());    //取出当前栈里面的2个元素,进行运算后,再push进去
                    break;
 
                case "-":
                    stack.push(-stack.pop() + stack.pop());
                    break;
 
                case "*":
                    stack.push(stack.pop() * stack.pop());
                    break;
 
                case "/":
                    int n1 = stack.pop(), n2 = stack.pop();
                    stack.push(n2 / n1);
                    break;
 
                default: // 如果是普通字符,则直接入栈
                    stack.push(Integer.parseInt(token));
            }
        }
 
        return stack.pop();
    }
 
    public static void main(String[] args) {
    
    
        String[] rpnExpression = {
    
    "2", "1", "+", "3", "*"};
        System.out.println(evalRPN(rpnExpression));
    }
}

この例では、evalRPN 関数は文字列の配列を受け入れます。各文字列は RPN 式の要素 (数値または演算子) を表します。次に、スタックを使用して数値を保存および操作します。

各要素について、それが演算子 (「+」、「-」、「*」、または「/」) であるかどうかがチェックされます。存在する場合、スタックから 2 つの要素をポップし、適切な操作を実行して、結果をスタックにプッシュし直します。要素が数値の場合、それをスタックにプッシュします。

すべての要素が処理された後、スタックの最上位の要素が式の結果になります。

main 関数では、逆ポーランド語表現の文字列配列 {"2", "1", "+", "3", "*"} を作成します。この式は正規表現 (2+1 )*3 と同等です。次に、 evalRPN 関数を呼び出して計算します。計算結果が印刷されます。

3+4 を例として分析すると、対応するポーランド語形式は 3 4 + です:
1) ポーランド語形式に従って、スタックにプッシュします
ここに画像の説明を挿入します
2) プッシュした後、スタックから要素を上から下に取り出します。 , 最上位は 1 つの演算子でなければなりませ
ん 演算記号をスタックから取り出すと、次の 2 つの要素が取り出され、演算されてスタックにプッシュされます
+ 記号を取り出した後、4 を取り出し、次に3 を取り出し、演算を実行して 7 を取得し、それをスタックにプッシュします。

このときのスタックの状態:
ここに画像の説明を挿入します
3) 後続のポリッシュをスタックにプッシュし続け、番号 5、6、および * を順番にプッシュします
ここに画像の説明を挿入します
4)
後続のポリッシュをスタックにプッシュし続け、番号 5、6、および * をプッシュします。および * の順に。

スタックの最上層がシンボルの場合は再度演算が必要となるため、以下の2つの要素を取り出して演算を行ってください。

5*6=30、30 をスタックにプッシュ

この時点のスタックの状態:
ここに画像の説明を挿入します
5) ポーランド語のコンテンツ (最後の * 記号) をプッシュし続けます。

ここに画像の説明を挿入します
30*7 + 210

3. 通常の式を逆ポーランド語形式に変換する方法

(3 + 4) * (5 * 6) はどのようにして 3 4 + 5 6 * * に変換されますか?

A + B は次のように整理する必要があることがわかります: AB + そして、複雑な数式についても同様で、A を (3+4) の式とみなすことができ、理解しやすくなります。

次に、処理の順序 (3 + 4) * (5 * 6):
1) 最初に大きなモジュールを変換します (3 + 4) (5 * 6) *
1) ステップ 1 の 3 + 4 を 3 4 +
2 に置き換えます)ステップ 1 の 5 * 6 を 5 6 * に置き換えます。
3) 最後の 3 4 + 5 6 *** を取得します。

:上面的是代数思想,不是计算机的处理方式,如过想写个程序进行计算,那么需要从左至右进行处理,基本原理和RPNCalculator 类似,只不过是反着写

参考

リバースポリッシュとは何ですか?

おすすめ

転載: blog.csdn.net/m0_45406092/article/details/131705613