キューを実装する方法を知りたい。。。!!
ここでは、キューについて既に知っている人も初めて知る人も実装できることを目指します!
一つ一つ大事な部分の手順を説明していきますので、プログラムを理解しながら作りたい人はぜひ参考にしてください♪
キューとは何?
まずキューについて復習して理解を深めましょう♪
「一端が入口で、もう一端が出口となっているリスト」のことで、一番最初に入れたものが一番最初に取り出すことのできる構造になります。
簡単に思い出すためのイメージは、「トンネル」です!
トンネルに入ったデータがそのまま出口に流れていくイメージを持てばいいと思います!
キューには2種類の操作があります。
エンキュー:データを入れる
デキュー:データを取り出す
さらに詳しく知りたい方はこちらで解説してますのでご覧ください。
プログラムの作成
それでは作っていきましょう。
構成される内容
どのようなプログラムを作るのか詳細に決めます。
・キューを画面に表示させる関数を作る
・エンキューを行う関数を作る
・デキューを行う関数を作る
この3つの関数を作りつつ、キーボードから文字を入力してキューにデータを入れていくものを作ります。
1.プログラムの大枠を書いていく
関数の大枠の内容が決まったので、まずは全体の内容を書いていきます。
#include <stdio.h>
int main(void) {
int rear=0;
int top=0;
char s[10];
char k[10];
char a;
int d=0;
printf("キーボードから文字を入力\n0でプログラム終了\n1で1文字dequeueした後dequeueした文字とキューの内容を表示\nその他の文字を入力した場合その文字をenqueueした後キューの内容を表示\n");
while(d==0){
printf("コマンド:");
scanf("%c",&a);
printf("\n");
if(a=='0'){
printf("プログラムを終了\n");
d=1;
}else if(a=='1'){
k[0]=dequeue(&s,&top);
print_queue(s,top,rear);
printf("取り出したデータは%cです\n",k[0]);
}else{
enqueue(a,&s,&rear);
print_queue(s,top,rear);
}
}
return 0;
}
まず、決めた変数や関数について解説していきます。
rear・・・配列の何番目に最後の要素が入っているのか
top・・・配列の何番目に先頭の要素が入っているのかを記憶しておくための変数
s・・・キューとしてデータを保存する変数
k・・・デキューした文字を表すための変数
a・・・キーボードからの入力を入れるための変数
d・・・while文の終了条件に使う数字
enqueue・・・データを入れるための自分で作る関数。aとsとrearを入れることにより、キューに文字を1文字入れて、rearの数字を一つ増やす。
dequeue・・・データを取り出すための自分で作る関数。sとtopを入れることにより、キューから文字を1文字取り出して、topの数字を一つ増やす。
print_queue・・・キューを表示させるための自分で作る関数。sとtopとrearを入れることにより、キューと入っているデータ数を表示させる。
重要なところを解説していきます。
scanfで文字を読み込みます。ただし、エンターを押すと改行も含まれるのでctrl+Dでデータ入力を終了する裏技的な特殊文字を押します。
while文で文字を入れていくようにして、数字の0が入れられた場合は繰り返しを終わらせ、1が入力された場合はデキューをします。
2.自分で作る関数を書いていく
enqueueを作ります。
void enqueue(char c, char *q, int *rear){
int a =*rear;
q[a]=c;
*rear=*rear+1;
}
ポインタを使うことでmain関数内の変数を書き換えることができます。
返り値は必要ないので、voidを使います。
dequeueを作ります。
char dequeue(char *q, int *top){
int a=*top;
char t;
t=q[a];
q[a]= NULL;
*top=*top+1;
return(t);
}
文字を取り出すので、返り値をcharにします。
エンキューと同じくポインタを使うことで、main関数のtopの値を変更します。
print_queueを作ります。
void print_queue(char *q,int top, int rear){
int l=top;
int k=rear;
while(rear>top){
if(l==top){
printf("--TOP=%d--\n",top);
}
printf("%c",q[top]);
top++;
printf("\n");
if(k==top){
printf("--REAR=%d--",rear);
printf("\n");
}
}
}
printfで画面に表示させるだけなので、こちらも「void」を使って返り値を必要としません。
3.まとめて完成!
最後にこれまで書いてきたコードをまとめましょう♪
#include <stdio.h>
void enqueue(char c, char *q, int *rear){
int a =*rear;
q[a]=c;
*rear=*rear+1;
}
char dequeue(char *q,int *top){
int a=*top;
char t;
t=q[a];
q[a]= NULL;
*top=*top+1;
return(t);
}
void print_queue(char *q, int top, int rear){
int l=top;
int k=rear;
while(rear>top){
if(l==top){
printf("--TOP=%d--\n",top);
}
printf("%c",q[top]);
top++;
printf("\n");
if(k==top){
printf("--REAR=%d--",rear);
printf("\n");
}
}
}
int main(void) {
int rear=0;
int top=0;
char s[10];
char k[10];
char a;
int d=0;
printf("キーボードから文字を入力\n0でプログラム終了\n1で1文字dequeueした後dequeueした文字とキューの内容を表示\nその他の文字を入力した場合その文字をenqueueした後キューの内容を表示\n");
while(d==0){
printf("コマンド:");
scanf("%c",&a);
printf("\n");
if(a=='0'){
printf("プログラムを終了\n");
d=1;
}else if(a=='1'){
k[0]=dequeue(&s,&top);
print_queue_ary(s,top,rear);
printf("取り出したデータは%cです\n",k[0]);
}else{
enqueue(a,&s,&rear);
print_queue_ary(s,top,rear);
}
}
return 0;
}
4.うまく実行できるか確認!
作成したプログラムが意図した通りに動くか見てみます。
キーボードから文字を入力
0でプログラム終了
1で1文字dequeueした後dequeueした文字とキューの内容を表示
その他の文字を入力した場合その文字をenqueueした後キューの内容を表示
コマンド:k
–TOP=0–
k
–REAR=1–
コマンド:a
–TOP=0–
k
a
–REAR=2–
コマンド:n
–TOP=0–
k
a
n
–REAR=3–
コマンド:1
–TOP=1–
a
n
–REAR=3–
取り出したデータはkです
コマンド:d
–TOP=1–
a
n
d
–REAR=4–
コマンド:0
プログラムを終了
Program ended with exit code: 0
文字を入力すればキューの中に文字が入っていき、1を押すとでキューされ、0でプログラムを終了させることができました。
これで完成です!!!
まとめ
今回はc言語でキューを実装してみました!
他にもスタックをc言語で実装させたものがありますのでよければそちらもご覧ください。
スタックの方では「scanfをctrl+Dで実行しない方法」で実装してますので参考にしてください。