逆ポーランド電卓のつくりかた ── 脱ビギナ系 データ構造とアルゴリズム講座 「StackとRPN」

Slides:



Advertisements
Similar presentations
1 情報基礎 A 第 9 週 プログラミング入門 VBA の基本文法 1 準備・変数・データの入出力 徳山 豪・全 眞嬉 東北大学情報科学研究科 システム情報科学専攻 情報システム評価学分野.
Advertisements

わんくま同盟 東京勉強会 #10 オブジェクト指向 #1 Windows メッセージを使いこな す -Windows 流オブジェクト指向 - とっちゃん 高萩 俊行 Microsoft MVP for Windows SDK 2005/ /09.
5.制御構造と配列 場合分け( If Then Else , Select Case ) 繰返し( Do While ) 繰返しその2( For Next )
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
プログラミング言語としてのR 情報知能学科 白井 英俊.
Visual Studio 2005による XML Web サービス入門
επιστημη さん 提供の VB.NETプログラムを丸裸にする!?
12.3,E,-15, 12.3,E5,+,=, >,<,…,
中置記法(IN) → 後置記法(RPN) 例) 1 + 2 * 数字はstAへ 演算子はstBへ stA stB.
中置記法(IN) → 後置記法(RPN) 例) 1 + 2 * ( ) 数字はstAへ 演算子はstBへ stA stB.
基本情報技術概論(第4回) 埼玉大学 理工学研究科 堀山 貴史
Ibaraki Univ. Dept of Electrical & Electronic Eng.
C++ むかしばなし episthmh わんくま同盟 Microsoft MVP for
コンパイラ 第9回 コード生成 ― スタックマシン ―
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
情報工学概論 (アルゴリズムとデータ構造)
プログラミング言語論 第4回 式の構文、式の評価
2006/10/19 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井英二郎
アルゴリズムとデータ構造 2011年6月13日
MSBuild 色々出来るよ 2011/04/02 お だ.
プログラミング論 II 電卓,逆ポーランド記法電卓
アルゴリズムとデータ構造1 2009年6月25日
データ構造とアルゴリズム 第5回 スタック ~ データ構造(2)~.
Stack & Queue & List 3.
  【事例演習6】  数式インタプリタ      解 説     “インタプリタの基本的な仕組み”.
エージェントを管理するボスの苦悩 問題 n人のエージェントを部下に持つボスがいる. エージェントは出張・帰還を頻繁に繰り返す.
アルゴリズムとデータ構造 第4回 配列によるスタックとキュー.
①データ構造 ②アルゴリズム ③プログラム言語 ④マークアップ言語
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
情報処理1~第12回~ 野中良哲.
~手続き指向からオブジェクト指向へ[Ⅱ]~
2009/10/16 いろいろなデータ構造 第3講: 平成21年10月16日 (金) 4限 E252教室 コンピュータアルゴリズム.
ハッシュ表 データ構造とプログラミング(12)
データ構造とアルゴリズム 第4回 リスト ~ データ構造(1)~.
大岩 元 慶応大学環境情報学部 数式の表現と日本語 大岩 元 慶応大学環境情報学部
逆ポーランド電卓のつくりかた ── 脱ビギナ系 データ構造とアルゴリズム講座 「StackとRPN」
データ構造とアルゴリズム 第5回 スタック ~ データ構造(2)~.
R流・C#マルチスレッドの復讐 2009年05月16日 R・田中一郎
データ構造と アルゴリズム第4回 知能情報学メジャー 和田俊和.
WinUnit お気楽お手軽 UnitTest
WinUnit お気楽お手軽 UnitTest
アルゴリズムとデータ構造 2010年6月28日
アルゴリズムとデータ構造1 2005年6月28日
コンパイラ 第13回 上昇型構文解析(1) 38号館4階N-411 内線5459
わんくま同盟茶藝部顧問 Microsoft MVP for VC episthmh
アルゴリズムとデータ構造1 2005年7月1日
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング 4 整列アルゴリズム.
プログラミング 3 スタックとキュー.
アルゴリズムとデータ構造 2011年7月8日課題の復習
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分
データ構造とアルゴリズム (第3回) 静岡大学工学部 安藤和敏
コンピュータアーキテクチャ 第 4 回.
数式の表現と日本語 データ構造とプログラミング(6)
情報基礎Ⅱ (第1回) 月曜4限 担当:北川 晃.
アルゴリズムとデータ構造 2012年7月2日
アルゴリズムとデータ構造 2012年6月11日
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
第8回 データを収納する (スタックとキュー)
nativeの基礎知識 「ポインタ」てなによ!?
アルゴリズムとデータ構造 2013年7月2日
コンピュータアーキテクチャ 第 4 回.
蓄積されたオブジェクトの動作履歴を用いた 実行履歴削減手法の提案
pf-6. スタック (Python プログラミング基礎を演習で学ぶシリーズ)
How To WPF アプリケーション Part4 By 中博俊.
データ構造と アルゴリズムI 第三回 知能情報学部 新田直也.
6.2 高速フーリエ変換 (1)FFT(fast Fourier transform)とは
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
C++ むかしばなし episthmh わんくま同盟 Microsoft MVP for
C++ むかしばなし episthmh わんくま同盟 Microsoft MVP for
Presentation transcript:

逆ポーランド電卓のつくりかた ── 脱ビギナ系 データ構造とアルゴリズム講座 「StackとRPN」 わんくま同盟 episthmh episteme@cppll.jp Microsoft MVP for Visual C++ (2004-)

スタック(Stack)てなんぞ? (1) Pez(ペッツ) 知ってる? 遠足のおやつに持ってったアレ。

またの名を First-In/Last-Out(FILO)バッファ スタック(Stack)てなんぞ? (2) またの名を First-In/Last-Out(FILO)バッファ First-In : 最初に入れたのが Last-Out : 最後に出てくる Pushで入れて Popで取り出す

RPN(Reverse Polish Notation) 逆ポーランド記法 : 計算式の表現のひとつ 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」

RPN式を左から順に読み… この操作を繰り返し、 最後にStackに残ったのが答 数値なら 演算子なら StackにPush 演算子なら StackからPopして StackからPopして ← 単項演算なら省略 演算子に応じた計算をして 結果をStackにPush この操作を繰り返し、   最後にStackに残ったのが答

計算式 : 1 2 + 1 2 + RPN をStackで計算してみよう (1) 1 + 2 = ※ 最下部がStackの先頭 1 1 2 3   1     2     + 数値→  Push 数値→  Push 演算子→  PopしてPopして  計算して  Push

計算式 : 1 2 + 3 4 + × 1 2 + 3 4 + × 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/計算するだけの簡単なお仕事です。

すっごく単純 演算子に優先順位がない 日本語と同じ順序 Stack一本で計算できる → 計算機向き 演算子が出てきたらすぐさま計算 RPNの特徴 すっごく単純 Stack一本で計算できる → 計算機向き 演算子に優先順位がない 演算子が出てきたらすぐさま計算 カッコ がいらない = もない 日本語と同じ順序 (1 + 2) ×( 3 + 4 ) =  1 に 2 を たして、3 に 4 を たして、かける → 1 2 + 3 4 + ×

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

Stackは.NET Frameworkに実装済 System.Collections.Stack Sub Push(ByVal Item As Object) Function Pop() As Object System.Collections.Generic.Stack(Of T) Sub Push(ByVal Item As T) Function Pop() As T 今回、こいつらは使いません

Push Pop 末尾に追加 リスト.Add(item) Stackは可変長配列 System.Collections.IList, System.Collections.Generic.IList(Of T) で代替可 Push 末尾に追加 リスト.Add(item) Pop 末尾から取り出し Dim item As T = リスト(リスト.Count-1)リスト.RemoveAt(リスト.Count-1) Return item 末尾要素のインデクス

DEMO-1 ListBox.ItemsをStackとして利用する Public ReadOnly Property Items As ListBox.ObjectCollection Public Class ObjectCollection Implements IList, ICollection, IEnumerable IListならStackがわりに使えるぢゃん!

拡張メソッドで IList に Push/Pop を追加 Imports System.Runtime.CompilerServices Imports System.Collections.Generic Namespace Wankuma.Episteme Module ListExtensions <Extension()> Public Sub PushBack(ByVal Self As IList, ByVal item As Object)             Self.Add(item) End Sub <Extension()> Public Function PopBack(ByVal Self As IList) As Object Dim result As T = Self(Self.Count - 1) Self.RemoveAt(Self.Count - 1) Return result End Function … End Module End Namespace

Smart UI (利口なUI) アンチパターン 層状アーキテクチャの対極をなすアンチパターン。 ビジネスロジックやデータアクセスのコードが、UIのコードと一緒になってしまっている、いわばスパゲッティな状態。 利口なUIと呼ぶのは、ビジネスロジックを含むすべての処理がUIの中で行なわれるから。 最もやっつけで手軽なやり方がこれなので、設計を何も考ないとこの状態に陥ってしまう。

System.Collections.ObjectModel Collection(Of T) Implements IList(Of T), ICollection(Of T), IEnumerable(Of T), IList, ICollection, IEnumerable KeyedCollection(Of TKey, TItem) Inherits Collection(Of TItem) IListならStackがわりに使えんぢゃん! 要素の追加/削除/変更を再定義可 → Model/Viewの分離

Public Class ListCollection(Of T) Inherits Collection(Of T) Public Target As ListBox Protected Overrides Sub InsertItem(ByVal index As Integer, _ ByVal newItem As T) MyBase.InsertItem(index, newItem) ‘ もともとの InsertItem を呼ぶ Target.Items.Insert(index,newItem) ‘ ListBox にも Insert する End Sub SetItem, RemoveItem, ClearItems についても同様。 End Class

System.Collections.ObjectModel をタネにして… IList(Of T) INotifyCollectionChanged 配列 変更受理 変更通知 ISyncWithCollectionChanged Collection(Of T) ObservableCollection(Of T) 辞書 ListSyncWithCollectionChanged IListに反映 KeyedCollection(Of TKey,TItem) ListBox,ListView,ComboBox の Items 新たに作る! ObservableKeyedCollection(Of Tkey,TItem)

ちょいといじって使う (派生/拡張メソッド/ヘルパ) なければ作る アナタはいまどこ? Wizardが吐くものを使う ライブラリから探して使う ちょいといじって使う (派生/拡張メソッド/ヘルパ) なければ作る アプリべったり(作り捨て/使い捨て)なら簡単 ツブシの効くものはそれなりのスキルが必要