プログラムでデータを効率よく扱うために欠かせないのが「データ構造」の理解です。
データ構造というとなんだか難しそうな感じがしますが、配列や連結リストもデータ構造のひとつであり、プログラミング学習中の方は実際にコードを書いたこともあると思います。
他にもスタックとキューや木構造、グラフなどのデータ構造がありますが、今回はその中でも基本となるスタックとキューについて学べる動画講座「C言語入門編9: データ構造について理解しよう」を紹介します。
まずはスタックとキューがどのようなデータ構造かを理解し、配列を使って実装する方法を学びます。最終的にはRPGの攻撃シーンのようなプログラムを作成しましょう!
C言語でデータ構造を学ぼう
本題に入る前にC言語の基本を押さえておきたいという方は「C言語入門編」を受講してみてください。
特に配列についてはこちらの講座で復習しておくと、このあとの内容が理解しやすいと思います。
スタックとキューとは?
スタックとキューは以下のような特徴があり、データを追加することをプッシュ(push)、取り出すことをポップ(pop)と表現することが多いです。
スタック
スタックは最後に追加したデータを最初に取り出す、後入れ先出し方式です。LIFO(Last In First Out)と呼ばれます。
図のようにお皿を積み重ねて、取るときをイメージすると分かりやすいと思います。
配列で実装してみよう
スタックとキューがどういったものか分かったので、さっそくC言語で実装していきましょう。
はじめにスタックを配列で実装する方法を学習します。スタックの基本操作は、データの追加(push)と削除(pop)ですよね。
paizaラーニングではこの画面のように左側に学習動画、右側にエディタという構成になっているため、動画の説明を見てすぐにコードを書いて実行することができます。
まずは基本操作をさせるための準備からです。動画で説明があったコードを書いてみると…
#include <stdio.h> #define N 10 typedef int data_t; data_t stack[N]; int size; void init(void) { size = 0; } int main(void) { }
ここではスタックのサイズをマクロを使って定義しています。defineマクロは、配列の大きさを後から変更するときなどに便利です。
次のチャプターで実際にデータの追加と削除の処理を実装します。
データ追加(push)の関数をこのように定義しました。
void push(data_t x) { if (size >= N) { printf("stack overflow\n"); return; } stack[size] = x; size++; }
size 変数の値が N 以上のときは、それ以上データを追加できないので、「stack overflow」と出力して return で処理を終了させます。
つづいて、削除(pop)の関数はこのように定義しました。
void pop(data_t *x) { if (size <= 0) { printf("stack underflow\n"); return; } *x = stack[size - 1]; size--; }
今度はsize 変数の値が 0 以下のときは、それ以上データを取り出せないので、「stack underflow」と出力して return で処理を終了させます。
同様にキューの実装も「#05:キューを実装しよう (1)」と「#06:キューを実装しよう (2) 」で説明しています。
キューを応用してRPGの攻撃シーンを作ろう
ただデータの入出力の処理を書いてもあまりおもしろくないので、最後にRPGの攻撃シーンを想定した実装をしてみましょう!
ここではキューに構造体を追加して取り出したり、攻撃値をランダムな値で生成したりといった処理も扱っています。
// main関数に定義するコードの一部 // キューに追加する data_t slime = {"スライム", 5}; data_t monster = {"モンスター", 10}; data_t dragon = {"ドラゴン", 20}; enqueue(slime); enqueue(monster); enqueue(dragon); // キューから取り出す data_t target; dequeue(&target); printf("%s\n", target.name);
スライムやモンスター、ドラゴンが出てきますが、自分でも追加したりしていろいろ工夫をしてみてください。
ちなみに構造体については「C言語入門編8: 構造体を理解しよう」で説明しています。もし分かりにくい部分があればそちらに戻って復習するとよいですね。
プログラミング問題を解いて実装力を鍛えよう
「C言語入門編」で基本を学んだら、アウトプットをたくさんしてコードを書く力を身につけましょう。
レベルアップ問題集で練習する
「レベルアップ問題集」では、時間制限なく、何度でも繰り返して問題に取り組むことができる練習問題を用意しています。
問題の難易度はS・A・B・C・Dに分かれており、プログラミング学習を始めたばかりであればまずはDランク相当の問題にチャレンジしてみてください。
テストケースと入力値、一部の問題は解答例のコードも見ることができます。レベルアップ問題集の問題は分からないところがあれば人に聞いてみたり、教え合ったりしていただいて構いません。
スキルチェックで腕試し
スキルチェックとは、paizaが提供しているプログラミング問題を解いてプログラミングスキルをランクづけするサービスのことです。
さきほどの練習問題とは異なり、スキルチェック問題の解答は制限時間があります。問題の要求仕様に対して正しい結果が出ることはもちろん、プログラムの実行速度や解答時間を加味して採点しスコアを出します。詳しくはこちらをごらんください。
スキルチェックで獲得したランクは、paizaが提供している就活や転職サービスで求人応募や企業からスカウトをもらうときに利用できます。(そのため問題のヒントや解答は公開しないようお願いしています。)
そして、ただいまスキルチェックに挑戦していただくと、抽選でAmazonギフト券が当たるキャンペーンを実施中です!
開催期間:
2020年5月21日(木) ~ 2020年6月4日(木) 11:59
参加資格:
いずれかのスキルチェック問題に挑戦し、paizaマイページのプロフィール入力率を50%以上にしてください。現在就活・転職活動をおこなっていない方でも参加資格を満たせば抽選対象になります。
【プロフィール入力率って?】
プロフィールはpaizaにログイン後、設定メニューの「基本情報」または「スキルPR・希望条件」の画面にて入力できます。プロフィール入力率は「スキルPR・希望条件」で確認できます。
プレゼント内容:
抽選でAmazonギフト券1,000円分を20名様にプレゼント
初めてスキルチェックに挑戦していただく方は、問題のランク別に取り組み方を解説している無料講座「スキルチェック入門編」を先に受講するとスムーズです。なお、標準入力処理を知りたい場合はこちらをごらんください。
まとめ
今回は、C言語で基本的なデータ構造のひとつである「スタックとキュー」を配列で実装する学習講座をご紹介しました。
また、学んだ内容が身についているか、プログラミング問題を解いて確認してみました。
プログラミング学習を始めたばかりで「ちょっと難しかったな…」という方は、基礎固めを先にやるとよいでしょう。本文でも紹介した「C言語入門編」は四則演算や条件文、ループ文といった基礎文法から、配列や関数なども動画で分かりやすく解説しています。
paizaでは学習講座の他に、ゲーム感覚でプログラミングが学べるコンテンツもご用意しています。
たとえば『コードクロニクル』は、ファンタジー系RPGのような世界観で簡単なプログラミング問題を解きながら物語を進めていくゲームとなっており、楽しみながらプログラミング学習ができます。
もっとたくさんC言語で問題を解きたい方は以下の記事も参考にしてみてくださいね。
これからプログラミング学習を始めたいという方には、paizaラーニングがおすすめです。Python、Java、C言語、C#、PHP、Ruby、SQL、JavaScript、HTML/CSSなど、プログラミング未経験者や初心者でも動画で学べる入門レッスンを公開しています。
「Python入門編」「C#入門編」「ITエンジニアの就活準備編」といった人気講座も完全無料となっておりますので、プログラミングを学びたい方・ITエンジニアを目指したい方はぜひごらんください。
詳しくはこちら