逆ポーランド記法のJavaプログラム

逆ポーランド記法 (Reverse Polish Notation: RPN) とは、数式の表現方法の一つで、演算子をオペランド (演算対象の数値) の後ろに記述する記法のことを言います。

通常の数式表現方法である中置記法 (infix notation) では、演算子の優先順位を決めるために、括弧などを使って優先順位を明示する必要があります。

しかし、逆ポーランド記法では、演算子をオペランドの後ろに記述することで、優先順位を明示的にする必要がありません。

例えば、通常の中置記法で表記された数式

「(3 + 4) * 5」

を逆ポーランド記法で表記すると、

「3 4 + 5 *」

となります。この場合、演算子がオペランドの後ろに記述されており、演算子の優先順位を明示するために括弧が必要ありません。

逆ポーランド記法は、コンピュータのプログラムで数式を扱う際に有用であり、スタックを使用した計算が容易になります。また、逆ポーランド記法は、プログラミング言語によっては標準的な表現方法として採用されることがあります。

以下のサンプルプログラムでは逆ポーランド記法で入力された式を計算します。

<サンプルプログラム>

import java.util.Scanner;
import java.util.Stack;

public class RPNCalculator {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Stack<Double> stack = new Stack<>();

        System.out.println("逆ポーランド記法で式を入力してください:");
        String input = scanner.nextLine();

        // 式をトークンに分割
        String[] tokens = input.split(" ");

        for (String token : tokens) {
            if (isNumeric(token)) {
                // 数字の場合はスタックにプッシュ
                stack.push(Double.parseDouble(token));
            } else {
                // 演算子の場合はスタックから2つの値をポップして演算
                double operand2 = stack.pop();
                double operand1 = stack.pop();
                double result = performOperation(token, operand1, operand2);
                // 結果をスタックにプッシュ
                stack.push(result);
            }
        }

        // 最終結果を出力
        System.out.println("計算結果は " + stack.pop() + " です。");
    }

    // 数値かどうかを判定するメソッド
    private static boolean isNumeric(String str) {
        try {
            double d = Double.parseDouble(str);
        } catch (NumberFormatException nfe) {
            return false;
        }
        return true;
    }

    // 演算を実行するメソッド
    private static double performOperation(String operator, double operand1, double operand2) {
        switch (operator) {
            case "+":
                return operand1 + operand2;
            case "-":
                return operand1 - operand2;
            case "*":
                return operand1 * operand2;
            case "/":
                return operand1 / operand2;
            case "%":
                return operand1 % operand2;
            case "^":
                return Math.pow(operand1, operand2);
            default:
                throw new IllegalArgumentException("無効な演算子です: " + operator);
        }
    }
}

<出力結果>

逆ポーランド記法で式を入力してください:
3 4 + 5 *
計算結果は 35.0 です。

以下のサンプルプログラムでは逆ポーランド記法を中置記法に戻します。逆ポーランド記法の式をスタックを使用して解析し、中置記法を再構築しています。

<サンプルプログラム>

import java.util.Scanner;
import java.util.Stack;

public class ReversePolishNotation {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Stack<String> stack = new Stack<>();

        System.out.println("逆ポーランド記法で式を入力してください:");
        String input = scanner.nextLine();

        // 式をトークンに分割
        String[] tokens = input.split(" ");

        for (String token : tokens) {
            if (isNumeric(token)) {
                // 数字の場合はスタックにプッシュ
                stack.push(token);
            } else {
                // 演算子の場合はスタックから2つの値をポップして式を再構築
                String operand2 = stack.pop();
                String operand1 = stack.pop();
                String subExpression = "(" + operand1 + " " + token + " " + operand2 + ")";
                // 再構築した式をスタックにプッシュ
                stack.push(subExpression);
            }
        }

        // 最終的にスタックに残った式が元の式になる
        System.out.println("逆ポーランド記法で入力された式: " + input);
        System.out.println("変換された式: " + stack.pop());
    }

    // 数値かどうかを判定するメソッド
    private static boolean isNumeric(String str) {
        try {
            double d = Double.parseDouble(str);
        } catch (NumberFormatException nfe) {
            return false;
        }
        return true;
    }
}

<出力結果>

逆ポーランド記法で式を入力してください:
3 4 + 5 *
逆ポーランド記法で入力された式: 3 4 + 5 *
変換された式: ((3 + 4) * 5)

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。