LoginSignup
2
1

More than 5 years have passed since last update.

C#:逆ポーランド記法を利用した数式の計算(3) ReversePolishNotationクラスを改良する

Last updated at Posted at 2017-11-13

前回は、数式をトークンに分解するクラスを作成しました。 このトークンは、最終的には並び順を変えて、ReversePolishNotationオブジェクトとして組み立てる必要があります。

記事一覧

逆ポーランド記法を利用した数式の計算(1) 逆ポーランド記法の計算
逆ポーランド記法を利用した数式の計算(2) 数式をトークンに分割する
逆ポーランド記法を利用した数式の計算(3) ReversePolishNotationクラスを改良する ← 当記事
逆ポーランド記法を利用した数式の計算(4) Contextクラスを定義する
逆ポーランド記法を利用した数式の計算(5) Interpreterパターンで数式を解析する
逆ポーランド記法を利用した数式の計算(6) 最後の仕上げ

第1回目に示したReversePolishNotation

第1回目で作成したReversePolishNotationでは、コンストラクタで、逆ポーランド記法で書かれた数式(文字列)を受けとる仕様でした。

そのクラスを再度掲載します。

public class ReversePolishNotation {
    public IEnumerable<string> Tokens { get; }

    public ReversePolishNotation(IEnumerable<string> tokens) {
        Tokens = tokens.ToList();
    }

    public ReversePolishNotation(string exp) {
        var tokens = exp.Split(' ')
                        .Where(s => s != "");
        Tokens = tokens.ToList();
    }
}

ReversePolishNotationを改良する

しかし、実際には取り出したトークンを並び変えて、一つ一つReversePolishNotationオブジェクトに追加していく必要があります。 ということで、Addメソッドを追加します。

せっかくなので、コンストラクタはそのまま残すことにします。

で書き換えたのが以下のコード。

public class ReversePolishNotation {
    private List<string> _tokens = new List<string>();

    public IEnumerable<string> Tokens => _tokens;


    public ReversePolishNotation(string exp = "") {
        var tokens = exp.Split(' ').Where(s => s != "");
        _tokens = tokens.ToList();
    }

    public void Add(string token) {
        _tokens.Add(token);
    }

    public override string ToString() {
        return String.Join(" ", Tokens.ToArray());
    }
}

ついでに、内部で保持しているTokensリストの内容を簡単に確認できるように、ToString()メソッドをoverrideしています。

ReversePolishNotationのテストプログラムを書いてみる

テストコード書くまでもない単純なクラスですが、ReversePolishNotationのテストプログラムを書いてみます。

class Program {
    static void Main(string[] args) {
        TestReversePolishNotation();
    }

    private static void TestReversePolishNotation() {
        var rpn = new ReversePolishNotation();
        rpn.Add("4");
        rpn.Add("2");
        rpn.Add("+");
        rpn.Add("15");
        rpn.Add("3");
        rpn.Add("+");
        rpn.Add("*");
        Console.WriteLine(rpn.ToString());
    }
}

実行結果

4 2 + 15 3 + *

ちゃんと、追加できているようです。

(続く)...


この記事は、Gushwell's C# Programming Pageで公開したものを加筆・修正したものです。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1