SlideShare uma empresa Scribd logo
1 de 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

Mais conteúdo relacionado

Mais procurados

関数型プログラミングとモナド
関数型プログラミングとモナド関数型プログラミングとモナド
関数型プログラミングとモナドMasayuki Isobe
 
ggplot2をつかってみよう
ggplot2をつかってみようggplot2をつかってみよう
ggplot2をつかってみようHiroki Itô
 
Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」Masayuki Isobe
 
論理思考とプログラミング第9回
論理思考とプログラミング第9回論理思考とプログラミング第9回
論理思考とプログラミング第9回Noritada Shimizu
 
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章Makoto Kawano
 
Rでisomap(多様体学習のはなし)
Rでisomap(多様体学習のはなし)Rでisomap(多様体学習のはなし)
Rでisomap(多様体学習のはなし)Kohta Ishikawa
 
[奈良県生駒市]中学校向け2030年へのインターンシップ: (1) AIとは何か?
[奈良県生駒市]中学校向け2030年へのインターンシップ: (1) AIとは何か?[奈良県生駒市]中学校向け2030年へのインターンシップ: (1) AIとは何か?
[奈良県生駒市]中学校向け2030年へのインターンシップ: (1) AIとは何か?Daiyu Hatakeyama
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Inc.
 
20150928楽しいlambda
20150928楽しいlambda20150928楽しいlambda
20150928楽しいlambdaNorifumi Homma
 
Tokyor42 ggplot2
Tokyor42 ggplot2Tokyor42 ggplot2
Tokyor42 ggplot2Yohei Sato
 
Nagoya.R #11 入門者講習
Nagoya.R #11 入門者講習Nagoya.R #11 入門者講習
Nagoya.R #11 入門者講習Yusaku Kawaguchi
 

Mais procurados (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 入門者講習
 

Semelhante a T77 episteme

第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016kyoto university
 
今日からはじめる微分方程式
今日からはじめる微分方程式今日からはじめる微分方程式
今日からはじめる微分方程式Ryo Kaji
 
姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい
姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい
姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしいKazkuki Oakamoto
 
Nagoya.R #12 入門者講習
Nagoya.R #12 入門者講習Nagoya.R #12 入門者講習
Nagoya.R #12 入門者講習Yusaku Kawaguchi
 
乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-
乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-
乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-Takuya Akiba
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Ransui Iso
 
自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -
自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -
自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -Ogushi Masaya
 
Enjoy handwritten digits recognition AI !!
Enjoy handwritten digits recognition AI !!Enjoy handwritten digits recognition AI !!
Enjoy handwritten digits recognition AI !!KAIKenzo
 
Pythonとdeep learningで手書き文字認識
Pythonとdeep learningで手書き文字認識Pythonとdeep learningで手書き文字認識
Pythonとdeep learningで手書き文字認識Ken Morishita
 
タダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitタダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitYasuhiko Yamamoto
 
Material
MaterialMaterial
Material_TUNE_
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~Takuya Akiba
 
数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツ数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツShuyo Nakatani
 
K010 appstat201201
K010 appstat201201K010 appstat201201
K010 appstat201201t2tarumi
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門Kimikazu Kato
 

Semelhante a 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の高速化
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
 

Mais de えぴ 福田

.NETラボ 2013-12-21 LT
.NETラボ 2013-12-21 LT.NETラボ 2013-12-21 LT
.NETラボ 2013-12-21 LTえぴ 福田
 
Episteme variadic template
Episteme variadic templateEpisteme variadic template
Episteme variadic templateえぴ 福田
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11えぴ 福田
 

Mais de えぴ 福田 (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