SlideShare une entreprise Scribd logo
1  sur  15
Télécharger pour lire hors ligne
アルゴリズム+データ構造
    勉強会(9)
   2013-04-08 アロハ)竹腰 彰成
第9回 配列(リスト・スタック・待
ち行列)
配列とは
• http://www.php.net/manual/ja/language.types.array.php
  • PHP の配列は、実際には順番付けられたマップです。マップは型の一種で、
    値をキーに関連付けます。 この型は、いくつかの手法で最適化されます。こ
    のため、 実際の配列またはリスト (ベクトル)、(あるマップの実装である) ハッ
    シュテーブル、ディレクトリ、コレクション、スタック、 キュー等として使用する
    ことが可能です。 PHP の配列には他の PHP 配列を値として保持することが
    できるため、 非常に簡単にツリー構造を表現することが可能です。
  • (キュー=待ち行列)
• PHPの場合、すべて配列として実装されている
  • 使い方を覚えればOK
リストとは
• リストとは……国語辞典によると「ある目的のために、多数の品目や
  数字などを書き出したもの。目録。一覧表」
• コンピュータサイエンスでは「要素を順番に並べたもの」
• PHPでは配列そのもの。特に意識することなく使っている(はず)。
リストの操作を改めて整理する
        No.               操作
    1         K番目の要素の前に要素を挿入する
    2         K番目の要素を削除する
    3         K番目の要素の内容を読む/書く
    4         特定のキーを持つ要素を探索する
    5         複数のリストを1つにまとめる
    6         1つのリストを複数に分割する
    7         リストの複製を作る
    8         リストに含まれる要素の数を求める

          「定本 Cプログラマのためのアルゴリズムとデータ構造」より
PHPでのリストの操作
      No.           操作                      PHPでの操作
  1         K番目の要素の前に要素を挿入する   array_splice()
  2         K番目の要素を削除する        array_splice()
  3         K番目の要素の内容を読む/書く    $array[$k]
  4         特定のキーを持つ要素を探索する    in_array()、foreach
  5         複数のリストを1つにまとめる     array_merge()、+演算子
  6         1つのリストを複数に分割する     array_slice()、array_chunk()
  7         リストの複製を作る          =演算子
  8         リストに含まれる要素の数を求める   count

• 一通りできるが、使い勝手は悪い
 • 目的に沿った、特化したものを使う⇒たとえばスタック、待ち行列
スタックとは
• スタックとは……英和辞典によると「(干し草などの)大きな山, 積みわ
  ら(haystack);(物のきちんとした)積み重ね, 山」

• 操作は「上に積み重ねる」「上から取り出す」
• Last In First Out(LIFO)
 • 最後に入れたのが最初に取り出される
• リストのうち、操作を制限したものと言える
スタックの操作
    No.          操作                 スタックの操作                PHPでの操作
1         K番目の要素の前に要素を挿入する   リストの最後に要素を追加する array_push()、$stack[]
2         K番目の要素を削除する        リストの最後の要素を取り出す array_pop()
3         K番目の要素の内容を読む/書く    リストの最後の要素を取り出す array_pop() /array_push()
4         特定のキーを持つ要素を探索する    (しない)                 -
5         複数のリストを1つにまとめる     (しない)                 -
6         1つのリストを複数に分割する     (しない)                 -
7         リストの複製を作る          (同じ)                  =演算子
8         リストに含まれる要素の数を求める   (同じ)                  count

• array_push()、array_pop()という専用関数がある
• $stack[] = ‘foo’; のような追加方法もある
スタックの使い道
• コンピュータの基礎的なところで使われている
 • メモリ管理
 • 関数呼び出し
• 何かのロジックを作る時の手法としてよく登場する
 • 電卓の実装
 • 構文解析
 • 探索問題を解くアルゴリズム
• webアプリでビジネスロジックに直接使うシーンはあまりないが……
 • 「元に戻る」実装での戻るべきURLを保存
待ち行列(キュー)とは
• キューとは……英和辞典によると「(順番を待つ人・車などの)列
  (line);(待つ)一群の人々」
• スーパーマーケットのレジ行列などを想像するとよい
   • ただしここではレジは1つとする
• Last In Last Out(LILO)
   • 最後に入れたものが最後に取り出される
   • =最初に入れたものが最初に取り出される
• リストのうち、操作を制限したものと言える
待ち行列(キュー)の操作
    No.           操作                  キューの操作           PHPでの操作
1         K番目の要素の前に要素を挿入する リストの最後に要素を追加する array_push()
2         K番目の要素を削除する         リストの最初の要素を取り出す   array_shift()
3         K番目の要素の内容を読む/書く     リストの最初の要素を取り出す   array_shift() /array_push()
4         特定のキーを持つ要素を探索する     (しない)            -
5         複数のリストを1つにまとめる      (しない)            -
6         1つのリストを複数に分割する      (しない)            -
7         リストの複製を作る           (同じ)             =演算子
8         リストに含まれる要素の数を求める    (同じ)             Count


• array_shift()、 array_push()という専用関数がある
待ち行列(キュー)の使い道
• まさに「待ち行列」として使われる
 • 処理待ちリスト
   • メールの大量送信:スタックだと最初に入れたものがいつ送信されるかわからない
   • バッチの大量処理:スタックだと最初に入れたものがいつ処理されるかわからない
 • メッセージキュー
   • OSでのイベント処理:操作した順番に処理していく
スタックと待ち行列(キュー)の使い分け
• 実装上の問題でスタックのほうが処理が速い
 • キューの「先頭に追加する」操作がちょっと重い
• それ以外は、要件により使い分ける
 • どちらでもいい場合はスタックを使ったほうが処理が速い
実習:スタックの利用
• スタックを使って「逆ポーランド記法」の電卓を作成してください
 • 計算式は「1 2 + 4 5 + *」
 • 考え方はwikipediaの「逆ポーランド記法」の「計算動作の例」にあります
 • http://ja.wikipedia.org/wiki/%E9%80%86%E3%83%9D%E3%83%BC%E3%83%
   A9%E3%83%B3%E3%83%89%E8%A8%98%E6%B3%95
• 勉強会の残り時間を使って書いてください。時間のある限り質問を
  受け付けます
• できあがったら提出してください
• 時間に間に合わない場合は宿題にします
今回の単語のまとめ
• リスト
• スタック
• FILO
• 待ち行列、キュー
• LILO

Contenu connexe

En vedette

アルゴリズム+データ構造勉強会(8)
アルゴリズム+データ構造勉強会(8)アルゴリズム+データ構造勉強会(8)
アルゴリズム+データ構造勉強会(8)noldor
 
アルゴリズム+データ構造勉強会(7)
アルゴリズム+データ構造勉強会(7)アルゴリズム+データ構造勉強会(7)
アルゴリズム+データ構造勉強会(7)noldor
 
アルゴリズム+データ構造勉強会(11)
アルゴリズム+データ構造勉強会(11)アルゴリズム+データ構造勉強会(11)
アルゴリズム+データ構造勉強会(11)noldor
 
アルゴリズム+データ構造勉強会(15)
アルゴリズム+データ構造勉強会(15)アルゴリズム+データ構造勉強会(15)
アルゴリズム+データ構造勉強会(15)noldor
 
アルゴリズム+データ構造勉強会(10)
アルゴリズム+データ構造勉強会(10)アルゴリズム+データ構造勉強会(10)
アルゴリズム+データ構造勉強会(10)noldor
 
アルゴリズム+データ構造勉強会(14)
アルゴリズム+データ構造勉強会(14)アルゴリズム+データ構造勉強会(14)
アルゴリズム+データ構造勉強会(14)noldor
 
アルゴリズム+データ構造勉強会(12)
アルゴリズム+データ構造勉強会(12)アルゴリズム+データ構造勉強会(12)
アルゴリズム+データ構造勉強会(12)noldor
 
Code igniterを初めて使うときにはまった4つのポイント(ノーマル版)
Code igniterを初めて使うときにはまった4つのポイント(ノーマル版)Code igniterを初めて使うときにはまった4つのポイント(ノーマル版)
Code igniterを初めて使うときにはまった4つのポイント(ノーマル版)noldor
 
アルゴリズム+データ構造勉強会(4)
アルゴリズム+データ構造勉強会(4)アルゴリズム+データ構造勉強会(4)
アルゴリズム+データ構造勉強会(4)noldor
 
Study 20131009
Study 20131009Study 20131009
Study 20131009fujii_t
 
アルゴリズム+データ構造勉強会(13)
アルゴリズム+データ構造勉強会(13)アルゴリズム+データ構造勉強会(13)
アルゴリズム+データ構造勉強会(13)noldor
 
アルゴリズム+データ構造勉強会(6)
アルゴリズム+データ構造勉強会(6)アルゴリズム+データ構造勉強会(6)
アルゴリズム+データ構造勉強会(6)noldor
 
アルゴリズム+データ構造勉強会(5)
アルゴリズム+データ構造勉強会(5)アルゴリズム+データ構造勉強会(5)
アルゴリズム+データ構造勉強会(5)noldor
 
Code igniterを初めて使うときにはまった4つのポイント
Code igniterを初めて使うときにはまった4つのポイントCode igniterを初めて使うときにはまった4つのポイント
Code igniterを初めて使うときにはまった4つのポイントnoldor
 
Java scriptによるテスト駆動開発
Java scriptによるテスト駆動開発Java scriptによるテスト駆動開発
Java scriptによるテスト駆動開発Hidekazu Nakamura
 

En vedette (16)

アルゴリズム+データ構造勉強会(8)
アルゴリズム+データ構造勉強会(8)アルゴリズム+データ構造勉強会(8)
アルゴリズム+データ構造勉強会(8)
 
アルゴリズム+データ構造勉強会(7)
アルゴリズム+データ構造勉強会(7)アルゴリズム+データ構造勉強会(7)
アルゴリズム+データ構造勉強会(7)
 
アルゴリズム+データ構造勉強会(11)
アルゴリズム+データ構造勉強会(11)アルゴリズム+データ構造勉強会(11)
アルゴリズム+データ構造勉強会(11)
 
アルゴリズム+データ構造勉強会(15)
アルゴリズム+データ構造勉強会(15)アルゴリズム+データ構造勉強会(15)
アルゴリズム+データ構造勉強会(15)
 
アルゴリズム+データ構造勉強会(10)
アルゴリズム+データ構造勉強会(10)アルゴリズム+データ構造勉強会(10)
アルゴリズム+データ構造勉強会(10)
 
アルゴリズム+データ構造勉強会(14)
アルゴリズム+データ構造勉強会(14)アルゴリズム+データ構造勉強会(14)
アルゴリズム+データ構造勉強会(14)
 
アルゴリズム+データ構造勉強会(12)
アルゴリズム+データ構造勉強会(12)アルゴリズム+データ構造勉強会(12)
アルゴリズム+データ構造勉強会(12)
 
Code igniterを初めて使うときにはまった4つのポイント(ノーマル版)
Code igniterを初めて使うときにはまった4つのポイント(ノーマル版)Code igniterを初めて使うときにはまった4つのポイント(ノーマル版)
Code igniterを初めて使うときにはまった4つのポイント(ノーマル版)
 
アルゴリズム+データ構造勉強会(4)
アルゴリズム+データ構造勉強会(4)アルゴリズム+データ構造勉強会(4)
アルゴリズム+データ構造勉強会(4)
 
Study 20131009
Study 20131009Study 20131009
Study 20131009
 
アルゴリズム+データ構造勉強会(13)
アルゴリズム+データ構造勉強会(13)アルゴリズム+データ構造勉強会(13)
アルゴリズム+データ構造勉強会(13)
 
アルゴリズム+データ構造勉強会(6)
アルゴリズム+データ構造勉強会(6)アルゴリズム+データ構造勉強会(6)
アルゴリズム+データ構造勉強会(6)
 
アルゴリズム+データ構造勉強会(5)
アルゴリズム+データ構造勉強会(5)アルゴリズム+データ構造勉強会(5)
アルゴリズム+データ構造勉強会(5)
 
Code igniterを初めて使うときにはまった4つのポイント
Code igniterを初めて使うときにはまった4つのポイントCode igniterを初めて使うときにはまった4つのポイント
Code igniterを初めて使うときにはまった4つのポイント
 
Sakura IoT Platform
Sakura IoT PlatformSakura IoT Platform
Sakura IoT Platform
 
Java scriptによるテスト駆動開発
Java scriptによるテスト駆動開発Java scriptによるテスト駆動開発
Java scriptによるテスト駆動開発
 

Similaire à アルゴリズム+データ構造勉強会(9)

12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと 12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと Haruka Ozaki
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
 
多次元配列機能比較
多次元配列機能比較多次元配列機能比較
多次元配列機能比較Masahiro Tanaka
 
scala.collection 再入門 (改)
scala.collection 再入門 (改)scala.collection 再入門 (改)
scala.collection 再入門 (改)Ryuichi ITO
 
第3回輪講
第3回輪講第3回輪講
第3回輪講mh_amako
 
すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪yashigani
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門Kimikazu Kato
 

Similaire à アルゴリズム+データ構造勉強会(9) (7)

12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと 12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
多次元配列機能比較
多次元配列機能比較多次元配列機能比較
多次元配列機能比較
 
scala.collection 再入門 (改)
scala.collection 再入門 (改)scala.collection 再入門 (改)
scala.collection 再入門 (改)
 
第3回輪講
第3回輪講第3回輪講
第3回輪講
 
すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
 

Dernier

論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 

Dernier (10)

論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 

アルゴリズム+データ構造勉強会(9)

  • 1. アルゴリズム+データ構造 勉強会(9) 2013-04-08 アロハ)竹腰 彰成
  • 3. 配列とは • http://www.php.net/manual/ja/language.types.array.php • PHP の配列は、実際には順番付けられたマップです。マップは型の一種で、 値をキーに関連付けます。 この型は、いくつかの手法で最適化されます。こ のため、 実際の配列またはリスト (ベクトル)、(あるマップの実装である) ハッ シュテーブル、ディレクトリ、コレクション、スタック、 キュー等として使用する ことが可能です。 PHP の配列には他の PHP 配列を値として保持することが できるため、 非常に簡単にツリー構造を表現することが可能です。 • (キュー=待ち行列) • PHPの場合、すべて配列として実装されている • 使い方を覚えればOK
  • 4. リストとは • リストとは……国語辞典によると「ある目的のために、多数の品目や 数字などを書き出したもの。目録。一覧表」 • コンピュータサイエンスでは「要素を順番に並べたもの」 • PHPでは配列そのもの。特に意識することなく使っている(はず)。
  • 5. リストの操作を改めて整理する No. 操作 1 K番目の要素の前に要素を挿入する 2 K番目の要素を削除する 3 K番目の要素の内容を読む/書く 4 特定のキーを持つ要素を探索する 5 複数のリストを1つにまとめる 6 1つのリストを複数に分割する 7 リストの複製を作る 8 リストに含まれる要素の数を求める 「定本 Cプログラマのためのアルゴリズムとデータ構造」より
  • 6. PHPでのリストの操作 No. 操作 PHPでの操作 1 K番目の要素の前に要素を挿入する array_splice() 2 K番目の要素を削除する array_splice() 3 K番目の要素の内容を読む/書く $array[$k] 4 特定のキーを持つ要素を探索する in_array()、foreach 5 複数のリストを1つにまとめる array_merge()、+演算子 6 1つのリストを複数に分割する array_slice()、array_chunk() 7 リストの複製を作る =演算子 8 リストに含まれる要素の数を求める count • 一通りできるが、使い勝手は悪い • 目的に沿った、特化したものを使う⇒たとえばスタック、待ち行列
  • 7. スタックとは • スタックとは……英和辞典によると「(干し草などの)大きな山, 積みわ ら(haystack);(物のきちんとした)積み重ね, 山」 • 操作は「上に積み重ねる」「上から取り出す」 • Last In First Out(LIFO) • 最後に入れたのが最初に取り出される • リストのうち、操作を制限したものと言える
  • 8. スタックの操作 No. 操作 スタックの操作 PHPでの操作 1 K番目の要素の前に要素を挿入する リストの最後に要素を追加する array_push()、$stack[] 2 K番目の要素を削除する リストの最後の要素を取り出す array_pop() 3 K番目の要素の内容を読む/書く リストの最後の要素を取り出す array_pop() /array_push() 4 特定のキーを持つ要素を探索する (しない) - 5 複数のリストを1つにまとめる (しない) - 6 1つのリストを複数に分割する (しない) - 7 リストの複製を作る (同じ) =演算子 8 リストに含まれる要素の数を求める (同じ) count • array_push()、array_pop()という専用関数がある • $stack[] = ‘foo’; のような追加方法もある
  • 9. スタックの使い道 • コンピュータの基礎的なところで使われている • メモリ管理 • 関数呼び出し • 何かのロジックを作る時の手法としてよく登場する • 電卓の実装 • 構文解析 • 探索問題を解くアルゴリズム • webアプリでビジネスロジックに直接使うシーンはあまりないが…… • 「元に戻る」実装での戻るべきURLを保存
  • 10. 待ち行列(キュー)とは • キューとは……英和辞典によると「(順番を待つ人・車などの)列 (line);(待つ)一群の人々」 • スーパーマーケットのレジ行列などを想像するとよい • ただしここではレジは1つとする • Last In Last Out(LILO) • 最後に入れたものが最後に取り出される • =最初に入れたものが最初に取り出される • リストのうち、操作を制限したものと言える
  • 11. 待ち行列(キュー)の操作 No. 操作 キューの操作 PHPでの操作 1 K番目の要素の前に要素を挿入する リストの最後に要素を追加する array_push() 2 K番目の要素を削除する リストの最初の要素を取り出す array_shift() 3 K番目の要素の内容を読む/書く リストの最初の要素を取り出す array_shift() /array_push() 4 特定のキーを持つ要素を探索する (しない) - 5 複数のリストを1つにまとめる (しない) - 6 1つのリストを複数に分割する (しない) - 7 リストの複製を作る (同じ) =演算子 8 リストに含まれる要素の数を求める (同じ) Count • array_shift()、 array_push()という専用関数がある
  • 12. 待ち行列(キュー)の使い道 • まさに「待ち行列」として使われる • 処理待ちリスト • メールの大量送信:スタックだと最初に入れたものがいつ送信されるかわからない • バッチの大量処理:スタックだと最初に入れたものがいつ処理されるかわからない • メッセージキュー • OSでのイベント処理:操作した順番に処理していく
  • 13. スタックと待ち行列(キュー)の使い分け • 実装上の問題でスタックのほうが処理が速い • キューの「先頭に追加する」操作がちょっと重い • それ以外は、要件により使い分ける • どちらでもいい場合はスタックを使ったほうが処理が速い
  • 14. 実習:スタックの利用 • スタックを使って「逆ポーランド記法」の電卓を作成してください • 計算式は「1 2 + 4 5 + *」 • 考え方はwikipediaの「逆ポーランド記法」の「計算動作の例」にあります • http://ja.wikipedia.org/wiki/%E9%80%86%E3%83%9D%E3%83%BC%E3%83% A9%E3%83%B3%E3%83%89%E8%A8%98%E6%B3%95 • 勉強会の残り時間を使って書いてください。時間のある限り質問を 受け付けます • できあがったら提出してください • 時間に間に合わない場合は宿題にします
  • 15. 今回の単語のまとめ • リスト • スタック • FILO • 待ち行列、キュー • LILO