逆ポーランド電卓のつくりかた(改)── 脱ビギナ系 データ構造とアルゴリズム講座 「StackとRPN」              わんくま同盟              episthmh episteme@cppll.jp          ...
スタック(Stack)てなんぞ? (1)Pez(ペッツ) 知ってる?遠足のおやつに持ってったアレ。       わんくま同盟 東京勉強会 #77
スタック(Stack)てなんぞ? (2)• またの名を First-In/Last-Out(FILO)バッ  ファ  – First-In : 最初に入れたのが  – Last-Out : 最後に出てくる• Pushで入れて Popで取り出す ...
逆ポーランド記法 : 計算式の表現のひとつ• RPN(Reverse Polish Notation)  – Jan Łukasiewicz (ヤン・ウカシェヴィチ)    • 1+2 を (+ 1 2) って書いてみた (LISPみたーい  ...
RPN をStackで計算(評価)する• RPN式を左から順に読み… – 数値なら  • StackにPush – 演算子なら  •   StackからPopして  •   StackからPopして ← 単項演算なら省略  •   演算子に応じ...
RPN をStackで計算してみよう (1)                            1+2=計算式 : 1 2 +                             ※ 最下部がStackの先頭             1...
RPN をStackで計算してみよう (2)                                       (1 + 2)×(3+4) =計算式 : 1 2 + 3 4 + ×                           ...
RPNの特徴• すっごく単純 – Stack一本で計算できる → 計算機向き• 演算子に優先順位がない  演算子が出てきたらすぐさま計算 – カッコ がいらない – = もない• 日本語と同じ順序 – (1 + 2) ×( 3 + 4 ) = ...
Stack二本で計算機を作る  ×          • 命令Stackに式を積む  +       • ひとつずつPopしながら   4           – 数値なら計算Stackに積   3         む  +          ...
ナカミはシックなModel / (View+Controller)View (MainWindow.xaml)              Model (Calculator.cs)                            Even...
「辞書」を使いたい…             ココが辞書ね。 わんくま同盟 東京勉強会 #77
• KeyedCollection<Tkey,TItem>  – INotifyCollectionChanged を実装していないし、    抽象クラスなのでちょっとばかし書き足しが    必要。• せっかくだから(?)作ってみた  – se...
ソート済み配列の検索と挿入に必要なもの• lower_bound / upper_bound  equal_range / binary_search { 0 1 2 2 3 4 4 4 5 7 8 9 } に4を挿入        lower...
set_adaptor<T>public class set_adaptor<T> : IList<T> {    private IList<T> list_;    private Func<T,T,bool> pred_;    publ...
Upcoming SlideShare
Loading in...5
×

T77 episteme

448

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
448
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

T77 episteme

  1. 1. 逆ポーランド電卓のつくりかた(改)── 脱ビギナ系 データ構造とアルゴリズム講座 「StackとRPN」 わんくま同盟 episthmh episteme@cppll.jp Microsoft MVP for Visual C++ (2004-) わんくま同盟 東京勉強会 #77
  2. 2. スタック(Stack)てなんぞ? (1)Pez(ペッツ) 知ってる?遠足のおやつに持ってったアレ。 わんくま同盟 東京勉強会 #77
  3. 3. スタック(Stack)てなんぞ? (2)• またの名を First-In/Last-Out(FILO)バッ ファ – First-In : 最初に入れたのが – Last-Out : 最後に出てくる• Pushで入れて Popで取り出す わんくま同盟 東京勉強会 #77
  4. 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. 5. RPN をStackで計算(評価)する• RPN式を左から順に読み… – 数値なら • StackにPush – 演算子なら • StackからPopして • StackからPopして ← 単項演算なら省略 • 演算子に応じた計算をして • 結果をStackにPush• この操作を繰り返し、 最後にStackに残ったのが答 わんくま同盟 東京勉強会 #77
  6. 6. RPN をStackで計算してみよう (1) 1+2=計算式 : 1 2 + ※ 最下部がStackの先頭 1 1 2 3 1 2 +数値→ 数値→ 演算子→ Push Push PopしてPopし て 計算して Push わんくま同盟 東京勉強会 #77
  7. 7. RPN をStackで計算してみよう (2) (1 + 2)×(3+4) =計算式 : 1 2 + 3 4 + × ※ 最下部がStackの先頭 3 1 3 3 31 2 3 3 4 7 211 2 + 3 4 + × Push/Pop/計算するだけの簡単なお仕事です。 わんくま同盟 東京勉強会 #77
  8. 8. RPNの特徴• すっごく単純 – Stack一本で計算できる → 計算機向き• 演算子に優先順位がない 演算子が出てきたらすぐさま計算 – カッコ がいらない – = もない• 日本語と同じ順序 – (1 + 2) ×( 3 + 4 ) = 1 に 2 を たして、3 に 4 を たして、かける →1 2 +3 4+ × わんくま同盟 東京勉強会 #77
  9. 9. Stack二本で計算機を作る × • 命令Stackに式を積む + • ひとつずつPopしながら 4 – 数値なら計算Stackに積 3 む + 3 – 演算子なら計算Stackか 3 2 らPopしてPopして、 4 1 計算してPush命令Stack 命令Stackが空になったとき、 計算Stack 計算Stackに残るのが答 RPN計算手順 わんくま同盟 東京勉強会 #77
  10. 10. ナカミはシックなModel / (View+Controller)View (MainWindow.xaml) Model (Calculator.cs) Event (データ更新! ) Event (ボタン押された! )Controller (MainWindow.xaml.cs コードビハインド) わんくま同盟 東京勉強会 #77
  11. 11. 「辞書」を使いたい… ココが辞書ね。 わんくま同盟 東京勉強会 #77
  12. 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. 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. 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
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×