質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1051閲覧

スタックやキューを作成する際に用いる方式の利点、欠点について

nana155

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/06/01 12:22

最近、スタックやキューを学んでいます。
これらを作成するには、構造体リストや配列、リングバッファなどを用いると思うのですが、この3つの方式に利点や欠点はありますか?
どのような場面でどの方式が活躍するのか、逆に何が向いていないのかなど気になっています。よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

んー、それぞれの利点・欠点が理解できていればわかるはずですが……

まず、配列(構造)とリスト構造で考えてみましょうか。

配列はイメージとしては『中身の見えない箱』(びっくり箱とかみたいな)が『横一列に並んでいる』感じです。
縦一列の場合もありますが、ここでは横一列をイメージします。

収納ボックスの横一列に連なっている感じでしょうか。

なので、『5番目の箱を開けろ』とかみたいなことが出来ます。

配列だと arr[5] とかです。

でも、配列は『要素数が決まっている』のです。

たとえばC言語で配列を宣言するなら、

C

1int arr[10]; // 要素数10の配列

と言う風に。そうすると『要素数を超えることが出来ない』のです。

上記であれば arr[11] とかを追加しようとしてもできません。

なので、やるなら『別の配列を用意して、値をコピーし、挿げ替える』しかないです。

C

1int tmp[10]; // データすでに入っているとして 2 3int arr[11]; // N+1 した要素数分確保 4 5int i; // for文用 6 7// tmpにあるデータをすべてarrにコピー 8for( i = 0; i < 10; i++ ){ 9 arr[i] = tmp[i]; 10} 11 12arr[10] = 8; // 追加したい値をセット 13 14// 以降は arrの方を使う

のような感じで。

なので計算量でいえば **O(n)**ですね。

リスト構造の場合、某イメージ( ) のような感じです。

そうですねぇ……子ども向けのおもちゃで、車系のおもちゃで、レールをつなげて自分で作るタイプ、ありますよね?
あのイメージです。

なので削除しようと思えば、その部分の前後を取り外し、削除したいものを削除して前後を直接つなげる。

後ろへの追加ならそのまま後ろの方につけるだけ。

なので (その場所にポインタなりが来ているという前提で) O(1) です。

したがって、スタック構造とかで使うなら、

[配列構造を利用] 利点: 実装が楽( 単に配列を用意するだけ ) 欠点: 要素数が固定の為、サイズがその都度変動する場合は再実装をするか、修正し直さないといけない [リスト構造を利用] 利点: 付け替えたりするだけのため、要素数の変動が可能 欠点: 実装が面倒すぎる……(C++ でも OKならすでに実装済みだが、C言語だと実装しないといけない)

ですね。


[追記1]

もうちょっと調べてください。

『リスト構造 C言語』とかで調べてください。

リスト構造への理解が甘いので、区別がつかないのだと思います。


[追記2]

スタック構造 リングバッファ』でggると、

例2がヒットしました。

ざっと調べただけでも普通にヒットしますから、ご自分で調べた方が早いですよ。

それとプロでも調べながらやっています。

検索力は必須です。

それでもわからない場合は『質問方法を工夫』しましょう。

そうすればもっとわかりやすい説明がつくと思いますよ。

投稿2021/06/01 12:52

編集2021/06/01 12:59
BeatStar

総合スコア4962

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nana155

2021/06/01 13:23

ご丁寧な回答ありがとうございます。 自分の勉強不足をつくづく感じました…。 もう一度学び直して精進したいと思います。 わかりやすいご説明とリンクまで本当にありがとうございました┏○
guest

0

もっと学んでください。
利点や欠点がわからないというのは、まだまだ知識が足りないということです

投稿2021/06/01 12:33

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問