プログラム研究 備忘録

java,C#,Unity等の備忘録です。経済理論も少し。

逆ポーランド記法について

逆ポーランド記法

数式やプログラムを記述する方法(記法)の一種。演算子(オペレータ)を被演算子オペランド)の後(右)に記述することから、後置記法 (Postfix Notation) とも言う。

 

javaのStackクラスを使う

 

縦長のビーカーがあるのをイメージし、数字を順番に入れていく。

演算子がある場合、スタックから数字2つを取り出し計算結果を上に積み上げる。

 

一番上にある数字が答えとなる。

「1 2 +」は「3」、「15 10 -」は「5」、「15 10 - 3 *」は「15」

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class ReversePolishNotationOld {

    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] stringArray = br.readLine().split("\\s");

        // 後に入れたものを先に抜き出す(いわゆるLIFO
        Stack<Integer> que = new Stack<Integer>();
        int a = 0;
        int b = 0;
        for (int i = 0; i < stringArray.length; i++) {
            if (stringArray[i].equals("+")) {
                a = que.pop();
                b = que.pop();
                que.add(b + a);
                continue;
            }
            if (stringArray[i].equals("-")) {
                a = que.pop();
                b = que.pop();
                que.add(b - a);
                continue;
            }
            if (stringArray[i].equals("*")) {
                a = que.pop();
                b = que.pop();
                que.add(b * a);
                continue;
            }
            if (stringArray[i].equals("/")) {
                a = que.pop();
                b = que.pop();
                que.add(b / a);
                continue;
            }
            // 演算子以外はstackに登録する
            que.push(Integer.parseInt(stringArray[i]));
        }
        System.out.println(que.pop());
    }
}