スタックを実装したいけど、どのようにして作れば良いのかわからない。。
ここでは、スタックについて既に知っている人も初めて知る人も実装できることを目指します!
重要な手順を一つ一つ説明していきますので、プログラムを理解しながら作りたい人はぜひ参考にしてください♪
そもそもスタックとは?
作る前に、スタックについて整理しておきましょう。
「要素の入口と出口が一つしかないリスト」のことで、一番最後に入れたものが一番最初に取り出すことのできる構造になります。
私的に簡単なイメージは、コップにデータを一つずつ上から入れていって、取り出すときは上からしか取り出せない構造のことです。笑
また、スタックにはプッシュとポップという動作があります。
プッシュ:データを入れる
ポップ:データを取り出す
さらに詳しく知りたい方はこちらで解説してますのでご覧ください。
プログラムの作成
では早速作っていきましょう!
構成される内容
どのようなプログラムを作るのか詳細に決めます。
・スタックを画面に表示させる関数を作る
・ポップを行う関数を作る
・プッシュを行う関数を作る
この3つの関数を作りつつ、キーボードから文字を入力してスタックにデータを入れていくものを作ります。
1.プログラムの大枠を書いていく
関数の大枠の内容が決まったので、その部分は後で書くとして全体の内容を書いていきます。
#include <stdio.h>
int main(void) {
char s1[10];
int top=0;
char k[10];
char a;
int d=0;
printf("キーボードから文字を入力\n0でプログラム終了\n1で1文字ポップした後ポップした文字とスタックの内容を表示\nその他の文字を入力した場合はその文字をプッシュした後スタックの内容を表示\n");
printf("コマンド:");
while(d==0){
scanf("%c",&a);
printf("\n");
if(a=='0'){
printf("プログラムを終了\n");
d=1;
}else if(a=='1'){
k[0]=pop(&s1,&top);
print_stack(s1,top);
printf("ポップした文字は%c\n",k[0]);
printf("コマンド:");
}else if(a!='\n'){
push(a,&s1,&top);
print_stack(s1,top);
printf("コマンド:");
}
}
return 0;
}
まず、決めた変数や関数について解説していきます。
s1・・ スタックを表す文字列
top・・スタックに入っているデータ数を表す
k・・・ポップした文字を表すための変数
a・・・キーボードからの入力を入れるための変数
d・・・while文の終了条件に使う数字
pop・・データを取り出すための自分で作る関数。s1とtopを入れることにより、スタックから文字を1文字取り出して、topの数字を一つ減らす。
push・・データを入れるための自分で作る関数。aとs1とtopを入れることにより、スタックに文字を一つ入れてtopの数字を一つ増やす。
print_stack・・スタックを表示させるための自分で作る関数。s1とtopを入れることにより、スタックと入っているデータ数を表示させる。
重要なところを解説します。
scanfで文字を読み込みます。ただし、scanfではエンターを押すと改行も読み込んでしまうので、if文で改行のものはスタックに入れないように工夫してあります。
while文で文字を入れていくようにして、数字の0が入れられた場合は繰り返しを終わらせ、1が入力された場合はポップをします。
2.自作の関数を書いていく
popを作ります。
char pop(char *s,int*top){
int a=(*top-1);
char t;
t=s[a];
s[a]=NULL;
*top=*top-1;
return(t);
返り値は取り出した文字にします。
ポインタを使うことによりmain関数で定義した変数の値を書き換えることができます。
pushを作ります。
void push(char c,char *s,int *top){
int a=*top;
s[a]=c;
*top=a+1;
}
プッシュは返り値が必要ないので「void」を使って関数を作ります。
popと同じくポインタを使って値を書き換えます。
print_stackを作ります。
void print_stack(char* s, int top){
printf("--TOP=%d--\n",top);
while(top>0){
top--;
printf("%c\n",s[top]);
}
}
printfで画面に表示させるだけなので、こちらも「void」を使って返り値を必要としません。
3.まとめて完成!
最後にこれまで書いてきたコードをまとめましょう♪
#include <stdio.h>
void print_stack(char* s, int top){
printf("--TOP=%d--\n",top);
while(top>0){
top--;
printf("%c\n",s[top]);
}
}
void push(char c,char *s,int *top){
int a=*top;
s[a]=c;
*top=a+1;
}
char pop(char *s,int*top){
int a=(*top-1);
char t;
t=s[a];
s[a]=NULL;
*top=*top-1;
return(t);
}
int main(void) {
char s1[10];
int top=0;
char k[10];
char a;
int d=0;
printf("キーボードから文字を入力\n0でプログラム終了\n1で1文字ポップした後ポップした文字とスタックの内容を表示\nその他の文字を入力した場合その文字をプッシュした後スタックの内容を表示\n");
printf("コマンド:");
while(d==0){
scanf("%c",&a);
printf("\n");
if(a=='0'){
printf("プログラムを終了\n");
d=1;
}else if(a=='1'){
k[0]=pop(&s1,&top);
print_stack(s1,top);
printf("ポップした文字は%c\n",k[0]);
printf("コマンド:");
}else if(a!='\n'){
push(a,&s1,&top);
print_stack(s1,top);
printf("コマンド:");
}
}
return 0;
}
4.確認!
うまく実行できるか試してみます。
実行結果は以下になります。
文字を入れたらスタックに入っていき、1を入力でポップされ、0でプログラムを終了することができました!
完成です!!!
まとめ
今回はc言語でスタックを実装してみました!
作り方を簡単に説明して、プログラムを理解できるように書いていきました。