Help us understand the problem. What is going on with this article?

配列を使ったキューとスタック

More than 1 year has passed since last update.

はじめに

この記事は書籍「プロを目指す人のためのRuby入門」に掲載できなかったトピックを著者自らが紹介するアドベントカレンダーの7日目です。
本文に出てくる章番号や項番号は書籍の中で使われている番号です。

この記事では配列を使ったキューとスタックを説明していきます。

必要な前提知識

「プロを目指す人のためのRuby入門」の第4章まで読み終わっていること。

配列を使ったキューとスタック

配列はキューやスタックとして使うこともできます。

キュー

キューは最初に入れたデータを最初に取り出すデータ構造です。このデータ構造はFIFO(First In First Out、先入れ先出し)と呼ばれることもあります。イメージ的には遊園地の入り口に並んだお客さんが順番に中へ入っていく様子を想像するとわかりやすいかもしれません。

IMG_8205.JPG

配列をキューとして使う場合は、要素の追加にpushメソッドを(<<でも可)、要素の取得と削除にshiftメソッドを使います。

queue = []

# 要素を末尾に追加する
queue.push '田中'
queue.push '鈴木'
queue #=> ["田中", "鈴木"]

# 先頭の要素を取得して削除する
queue.shift #=> "田中"
queue.shift #=> "鈴木"
queue       #=> []

スタック

スタックは最後に入れたデータを最初に取り出すデータ構造です。このデータ構造はLIFO(Last In First Out、後入れ先出し)と呼ばれることもあります。イメージ的には洗ったお皿を棚にしまい、そのお皿を棚から出す様子を想像するとわかりやすいかもしれません。

IMG_9648.JPG

配列をスタックとして使う場合は、要素の追加にpushメソッドを(<<でも可)、要素の取得と削除にpopメソッドを使います。

stack = []

# 要素を末尾に追加する
stack.push '大きい皿'
stack.push '小さい皿'
stack #=> ["大きい皿", "小さい皿"]

# 末尾の要素を取得して削除する
stack.pop #=> "小さい皿"
stack.pop #=> "大きい皿"
stack     #=> []

なお、配列の先頭に要素を追加したい場合はunshiftメソッドを使います。

fruits = ['melon', 'orange']
fruits.unshift 'apple'
fruits #=> ["apple", "melon", "orange"]

参考:prependとappend(Ruby 2.5)

Ruby 2.5ではunshift/pushのエイリアスメソッドとしてprepend/appendが追加されました。
Ruby 2.5以降であればこちらを使っても構いません。

array = [3, 4]
array.prepend(1, 2) #=> [1, 2, 3, 4]
array               #=> [1, 2, 3, 4]

array = [1, 2]
array.append(3, 4)  #=> [1, 2, 3, 4]
array               #=> [1, 2, 3, 4]

次回予告

次回は配列の便利メソッドをあれこれ紹介します。

jnchito
SIer、社内SEを経て、ソニックガーデンに合流したプログラマ。 「プロを目指す人のためのRuby入門」の著者。 http://gihyo.jp/book/2017/978-4-7741-9397-7 および「Everyday Rails - RSpecによるRailsテスト入門」の翻訳者。 https://leanpub.com/everydayrailsrspec-jp
https://blog.jnito.com/
sonicgarden
「お客様に無駄遣いをさせない受託開発」と「習慣を変えるソフトウェアのサービス」に取り組んでいるソフトウェア企業
http://www.sonicgarden.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした