T77 episteme
Upcoming SlideShare
Loading in...5
×
 

T77 episteme

on

  • 695 views

 

Statistics

Views

Total Views
695
Views on SlideShare
695
Embed Views
0

Actions

Likes
1
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

T77 episteme T77 episteme Presentation Transcript

  • 逆ポーランド電卓のつくりかた(改)── 脱ビギナ系 データ構造とアルゴリズム講座 「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 31 2 3 3 4 7 211 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