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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

2972閲覧

配列で実装されたスタックが満杯かどうか判定する関数を作成したい

yomoanyan

総合スコア14

C

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/04/28 09:22

前提・実現したいこと

次のプログラムで実装されたスタックがいっぱいかどうか判定する関数

bool istack_full(istackp p);

を作成したいです。
配列がいっぱいのときはtrue、そうでない時はfalseを返します。

用意した配列のサイズを覚えるため、スタックを表す構造体を

struct istack { int ptr; int *arr; int size;};

とし、sizeというメンバに配列サイズを覚えさせます。sizeメンバにはistack_new()の中で配列サイズを設定します。

作成したコード

C

1// istack.h 2#include <stdbool.h> 3struct istack; 4typedef struct istack *istackp; 5istackp istack_new(int size); // allocate new stack 6bool istack_isempty(istackp p); // test if the stack is empty 7bool istack_full(istackp p); // test if the stack is full 8void istack_push(istackp p, int v); // push a value 9int istack_pop(istackp p); // pop a value and return it 10int istack_top(istackp p); // peek the topmost value

C

1// istack.c 2#include <stdlib.h> 3#include "istack.h" 4struct istack { int ptr; int *arr; int size; }; 5istackp istack_new(int size) { 6 istackp p = (istackp)malloc(sizeof(struct istack)); 7 p->ptr = 0; p->arr = (int*)malloc(size * sizeof(int)); 8 p->size = sizeof(p->arr); //ここが怪しい 9 return p; 10} 11bool istack_isempty(istackp p) { return p->ptr <= 0; } 12 13bool istack_full(istackp p) { return p->ptr > p->size; } //ポインタptrが配列のサイズより大きい時trueを返す 14 15void istack_push(istackp p, int v) { p->arr[p->ptr++] = v; } 16int istack_pop(istackp p) { return p->arr[--(p->ptr)]; } 17int istack_top(istackp p) { return p->arr[p->ptr - 1]; }

C

1// test_of_fullstack.c --- 上の関数がきちんと動いているか確認する用 2#include <stdio.h> 3#include <stdlib.h> 4#include "istack.h" 5 6bool test_of_fullstack(char *t) { 7 istackp s = istack_new(1); //ここがよくわからない。試しに1を入れてます 8 for(int i = 0; t[i] != '\0'; ++i) { 9 char c = t[i]; 10 istack_push(s, c); //スタックに追加 11 if(istack_full(s)) { return true; } //istack_fullの結果がtrueならtrueを返し「いっぱい」を出力 12 } 13} 14 15int main(int argc, char *argv[]) { 16 printf("%s\n", test_of_fullstack(argv[1])?"いっぱい":"まだ余裕あり"); 17 return 0; 18}

わからないこと

1

スタックを実装するための配列のサイズをどうやって測定するのか。これでいいのか p->size = sizeof(p->arr); //ここが怪しい

2()ないの数字を変えても出力結果が同じ理由

istackp s = istack_new(1); //ここがよくわからない。試しに1を入れてます

3
istack_new()の中で配列サイズを設定するというのはどういうことなのか

試したこと

C

1コンパイル 2$ gcc8 istack.c test_of_fullstack.c

C

1実行 22(1)としたとき 3$ ./a.out 012345678 4いっぱい 5$ ./a.out 012345 6まだ余裕あり 7 8(10)としたとき 9$ ./a.out 012345678 10いっぱい 11$ ./a.out 012345 12まだ余裕あり

個人的には
2で(1)としたら、常にいっぱい
(2)としたら、
$./a.out 0
まだ余裕あり
$./a.out 01
いっぱい

と出るのを想定していました。そもそも確認用コードが間違っている可能性もありますが。。。よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

p->size = sizeof(p->arr); //ここが怪しい

sizeof(p->arr)は、arrのサイズ(=ポインタのサイズ、固定値)になります。arrが指す領域のサイズを入れようとしているようですが、スタックの要素数を入れるのがいいでしょう。例) p->size = size;
というか

bool istack_full(istackp p) { return p->ptr > p->size; }

こっちの関数はそういう想定になってますよね。

2()ないの数字を変えても出力結果が同じ理由

前述の通り

投稿2021/04/28 10:30

編集2021/04/28 10:33
sigsegv

総合スコア895

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

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

yomoanyan

2021/04/29 15:31

ありがとうございました。できました〜!
guest

0

struct istack;

istack の定義がありません
答えようがないです

投稿2021/04/28 09:25

y_waiwai

総合スコア87747

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

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

dodox86

2021/04/28 09:37

istack.cの方で宣言してます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問