Weitere ähnliche Inhalte
Ähnlich wie T77 episteme (20)
T77 episteme
- 3. スタック(Stack)てなんぞ? (2)
• またの名を First-In/Last-Out(FILO)バッ
ファ
– First-In : 最初に入れたのが
– Last-Out : 最後に出てくる
• Pushで入れて Popで取り出す
わんくま同盟 東京勉強会 #77
- 4. 逆ポーランド記法 : 計算式の表現のひとつ
• RPN(Reverse Polish Notation)
– Jan Łukasiewicz (ヤン・ウカシェヴィチ)
• 1+2 を (+ 1 2) って書いてみた (LISPみたーい
♪)
• 別名「前置記法: prefix notation」
• このひと論理学者でポーランド人
• なのでポーランド記法(Polish Notation)
– ポーランド記法をひっくり返したのがRPN
• 1 + 2 → (+ 1 2) → 1 2 + って書いてみようよ
• 別名「後置記法: postfix notation」
※ふつーの数式は 「中置記法: infix notation」
わんくま同盟 東京勉強会 #77
- 5. RPN をStackで計算(評価)する
• RPN式を左から順に読み…
– 数値なら
• StackにPush
– 演算子なら
• StackからPopして
• StackからPopして ← 単項演算なら省略
• 演算子に応じた計算をして
• 結果をStackにPush
• この操作を繰り返し、
最後にStackに残ったのが答
わんくま同盟 東京勉強会 #77
- 6. RPN をStackで計算してみよう (1)
1+2=
計算式 : 1 2 +
※ 最下部がStackの先頭
1
1 2 3
1 2 +
数値→ 数値→ 演算子→
Push Push PopしてPopし
て
計算して
Push
わんくま同盟 東京勉強会 #77
- 7. RPN をStackで計算してみよう (2)
(1 + 2)×(3+4) =
計算式 : 1 2 + 3 4 + ×
※ 最下部がStackの先頭
3
1 3 3 3
1 2 3 3 4 7 21
1 2 + 3 4 + ×
Push/Pop/計算するだけの簡単なお仕事です。
わんくま同盟 東京勉強会 #77
- 8. RPNの特徴
• すっごく単純
– Stack一本で計算できる → 計算機向き
• 演算子に優先順位がない
演算子が出てきたらすぐさま計算
– カッコ がいらない
– = もない
• 日本語と同じ順序
– (1 + 2) ×( 3 + 4 ) =
1 に 2 を たして、3 に 4 を たして、かける
→1 2 +3 4+ ×
わんくま同盟 東京勉強会 #77
- 9. Stack二本で計算機を作る
×
• 命令Stackに式を積む
+ • ひとつずつPopしながら
4
– 数値なら計算Stackに積
3 む
+ 3
– 演算子なら計算Stackか 3
2
らPopしてPopして、 4
1
計算してPush
命令Stack
命令Stackが空になったとき、 計算Stack
計算Stackに残るのが答
RPN計算手順
わんくま同盟 東京勉強会 #77
- 12. • KeyedCollection<Tkey,TItem>
– INotifyCollectionChanged を実装していないし、
抽象クラスなのでちょっとばかし書き足しが
必要。
• せっかくだから(?)作ってみた
– set_adaptor<T> : IList<T>をソート済み配列化
var list = new ObservableCollection<Item>();
set_adaptor<Item> adaptor =
new set_adaptor<Item>(list, 比較delegate);
adaptor.Add(new Item(“apple”,”りんご”));
…
わんくま同盟 東京勉強会 #77
- 13. ソート済み配列の検索と挿入に必要なもの
• lower_bound / upper_bound
equal_range / binary_search
{ 0 1 2 2 3 4 4 4 5 7 8 9 } に4を挿入
lower_bound upper_bound
{ 0 1 2 2 3 4 4 4 5 7 8 9 } に6を挿入
わんくま同盟 東京勉強会 #77
- 14. set_adaptor<T>
public class set_adaptor<T> : IList<T> {
private IList<T> list_;
private Func<T,T,bool> pred_;
public set_adaptor(IList<T> list, Func<T,T,bool> pred) {
list_ = list;
pred_ = pred;
…
}
…IList<T> メソッドをだらだらと再定義 (list_に対して追加/削除/etc.)
}
わんくま同盟 東京勉強会 #77