SlideShare ist ein Scribd-Unternehmen logo
1 von 14
逆ポーランド電卓のつくりかた(改)
── 脱ビギナ系 データ構造とアルゴリズム講座 「StackとRPN」



              わんくま同盟
              episthmh episteme@cppll.jp
              Microsoft MVP for Visual C++ (2004-)




           わんくま同盟 東京勉強会 #77
スタック(Stack)てなんぞ? (1)




Pez(ペッツ) 知ってる?
遠足のおやつに持ってったアレ。



       わんくま同盟 東京勉強会 #77
スタック(Stack)てなんぞ? (2)

• またの名を First-In/Last-Out(FILO)バッ
  ファ
  – First-In : 最初に入れたのが
  – Last-Out : 最後に出てくる
• Pushで入れて Popで取り出す




             わんくま同盟 東京勉強会 #77
逆ポーランド記法 : 計算式の表現のひとつ

• 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
RPN をStackで計算(評価)する

• RPN式を左から順に読み…
 – 数値なら
  • StackにPush
 – 演算子なら
  •   StackからPopして
  •   StackからPopして ← 単項演算なら省略
  •   演算子に応じた計算をして
  •   結果をStackにPush
• この操作を繰り返し、
  最後にStackに残ったのが答
                 わんくま同盟 東京勉強会 #77
RPN をStackで計算してみよう (1)

                            1+2=

計算式 : 1 2 +
                             ※ 最下部がStackの先頭
             1
  1          2          3



  1                2               +
数値→        数値→         演算子→
 Push       Push        PopしてPopし
                       て
                        計算して
                        Push

                 わんくま同盟 東京勉強会 #77
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
RPNの特徴
• すっごく単純
 – Stack一本で計算できる → 計算機向き
• 演算子に優先順位がない
  演算子が出てきたらすぐさま計算
 – カッコ がいらない
 – = もない
• 日本語と同じ順序
 – (1 + 2) ×( 3 + 4 ) =
   1 に 2 を たして、3 に 4 を たして、かける
  →1 2 +3 4+ ×
           わんくま同盟 東京勉強会 #77
Stack二本で計算機を作る


  ×
          • 命令Stackに式を積む
  +       • ひとつずつPopしながら
   4
           – 数値なら計算Stackに積
   3         む
  +                                  3
           – 演算子なら計算Stackか           3
   2
             らPopしてPopして、            4
   1
             計算してPush
命令Stack
            命令Stackが空になったとき、    計算Stack
            計算Stackに残るのが答
                           RPN計算手順



               わんくま同盟 東京勉強会 #77
ナカミはシックなModel / (View+Controller)
View (MainWindow.xaml)              Model (Calculator.cs)

                            Event
                            (データ更新! )




       Event (ボタン押された! )




Controller (MainWindow.xaml.cs コードビハインド)

                         わんくま同盟 東京勉強会 #77
「辞書」を使いたい…




             ココが辞書ね。




 わんくま同盟 東京勉強会 #77
• 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
ソート済み配列の検索と挿入に必要なもの

• 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
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

Weitere ähnliche Inhalte

Was ist angesagt?

論理思考とプログラミング第9回
論理思考とプログラミング第9回論理思考とプログラミング第9回
論理思考とプログラミング第9回
Noritada Shimizu
 
Rでisomap(多様体学習のはなし)
Rでisomap(多様体学習のはなし)Rでisomap(多様体学習のはなし)
Rでisomap(多様体学習のはなし)
Kohta Ishikawa
 
Tokyor42 ggplot2
Tokyor42 ggplot2Tokyor42 ggplot2
Tokyor42 ggplot2
Yohei Sato
 

Was ist angesagt? (12)

関数型プログラミングとモナド
関数型プログラミングとモナド関数型プログラミングとモナド
関数型プログラミングとモナド
 
ggplot2をつかってみよう
ggplot2をつかってみようggplot2をつかってみよう
ggplot2をつかってみよう
 
Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」
 
論理思考とプログラミング第9回
論理思考とプログラミング第9回論理思考とプログラミング第9回
論理思考とプログラミング第9回
 
Python for Data Anaysis第2回勉強会4,5章
Python for Data Anaysis第2回勉強会4,5章Python for Data Anaysis第2回勉強会4,5章
Python for Data Anaysis第2回勉強会4,5章
 
Rでisomap(多様体学習のはなし)
Rでisomap(多様体学習のはなし)Rでisomap(多様体学習のはなし)
Rでisomap(多様体学習のはなし)
 
[奈良県生駒市]中学校向け2030年へのインターンシップ: (1) AIとは何か?
[奈良県生駒市]中学校向け2030年へのインターンシップ: (1) AIとは何か?[奈良県生駒市]中学校向け2030年へのインターンシップ: (1) AIとは何か?
[奈良県生駒市]中学校向け2030年へのインターンシップ: (1) AIとは何か?
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説
 
20150928楽しいlambda
20150928楽しいlambda20150928楽しいlambda
20150928楽しいlambda
 
T69 episteme
T69 epistemeT69 episteme
T69 episteme
 
Tokyor42 ggplot2
Tokyor42 ggplot2Tokyor42 ggplot2
Tokyor42 ggplot2
 
Nagoya.R #11 入門者講習
Nagoya.R #11 入門者講習Nagoya.R #11 入門者講習
Nagoya.R #11 入門者講習
 

Ähnlich wie T77 episteme

Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Ransui Iso
 
K010 appstat201201
K010 appstat201201K010 appstat201201
K010 appstat201201
t2tarumi
 

Ähnlich wie T77 episteme (20)

第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016
 
今日からはじめる微分方程式
今日からはじめる微分方程式今日からはじめる微分方程式
今日からはじめる微分方程式
 
姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい
姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい
姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい
 
Nagoya.R #12 入門者講習
Nagoya.R #12 入門者講習Nagoya.R #12 入門者講習
Nagoya.R #12 入門者講習
 
乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-
乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-
乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
実用Brainf*ckプログラミング
実用Brainf*ckプログラミング実用Brainf*ckプログラミング
実用Brainf*ckプログラミング
 
自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -
自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -
自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -
 
はじめての「R」
はじめての「R」はじめての「R」
はじめての「R」
 
Enjoy handwritten digits recognition AI !!
Enjoy handwritten digits recognition AI !!Enjoy handwritten digits recognition AI !!
Enjoy handwritten digits recognition AI !!
 
Pythonとdeep learningで手書き文字認識
Pythonとdeep learningで手書き文字認識Pythonとdeep learningで手書き文字認識
Pythonとdeep learningで手書き文字認識
 
タダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitタダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnit
 
Material
MaterialMaterial
Material
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
 
数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツ数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツ
 
Gorinphp0729
Gorinphp0729Gorinphp0729
Gorinphp0729
 
Gorinphp0729
Gorinphp0729Gorinphp0729
Gorinphp0729
 
K010 appstat201201
K010 appstat201201K010 appstat201201
K010 appstat201201
 
Rの高速化
Rの高速化Rの高速化
Rの高速化
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
 

Mehr von えぴ 福田 (6)

Yokohama6 epi
Yokohama6 epiYokohama6 epi
Yokohama6 epi
 
.NETラボ 2013-12-21 LT
.NETラボ 2013-12-21 LT.NETラボ 2013-12-21 LT
.NETラボ 2013-12-21 LT
 
Episteme unique_ptr
Episteme unique_ptrEpisteme unique_ptr
Episteme unique_ptr
 
Episteme variadic template
Episteme variadic templateEpisteme variadic template
Episteme variadic template
 
T45 episteme
T45 epistemeT45 episteme
T45 episteme
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
 

T77 episteme

  • 1. 逆ポーランド電卓のつくりかた(改) ── 脱ビギナ系 データ構造とアルゴリズム講座 「StackとRPN」 わんくま同盟 episthmh episteme@cppll.jp Microsoft MVP for Visual C++ (2004-) わんくま同盟 東京勉強会 #77
  • 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
  • 10. ナカミはシックなModel / (View+Controller) View (MainWindow.xaml) Model (Calculator.cs) Event (データ更新! ) Event (ボタン押された! ) Controller (MainWindow.xaml.cs コードビハインド) わんくま同盟 東京勉強会 #77
  • 11. 「辞書」を使いたい… ココが辞書ね。 わんくま同盟 東京勉強会 #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