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 类似,只不过是反着写