前回は、数式をトークンに分解するクラスを作成しました。 このトークンは、最終的には並び順を変えて、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で公開したものを加筆・修正したものです。