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

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

ただいまの
回答率

87.59%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 541

score 5

前提・実現したいこと

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

bool istack_full(istackp p);

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

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

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

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

作成したコード

// istack.h
#include <stdbool.h>
struct istack;
typedef struct istack *istackp;
istackp istack_new(int size); // allocate new stack
bool istack_isempty(istackp p); // test if the stack is empty
bool istack_full(istackp p);    // test if the stack is full
void istack_push(istackp p, int v); // push a value
int istack_pop(istackp p);      // pop a value and return it
int istack_top(istackp p);      // peek the topmost value
// istack.c
#include <stdlib.h>
#include "istack.h"
struct istack { int ptr; int *arr; int size; };
istackp istack_new(int size) {
  istackp p = (istackp)malloc(sizeof(struct istack));
  p->ptr = 0; p->arr = (int*)malloc(size * sizeof(int));
  p->size = sizeof(p->arr); //ここが怪しい
  return p;
}
bool istack_isempty(istackp p) { return p->ptr <= 0; }

bool istack_full(istackp p) { return p->ptr > p->size; } //ポインタptrが配列のサイズより大きい時trueを返す

void istack_push(istackp p, int v) { p->arr[p->ptr++] = v; }
int istack_pop(istackp p) { return p->arr[--(p->ptr)]; }
int istack_top(istackp p) { return p->arr[p->ptr - 1]; }
// test_of_fullstack.c --- 上の関数がきちんと動いているか確認する用
#include <stdio.h>
#include <stdlib.h>
#include "istack.h"

bool test_of_fullstack(char *t) {
  istackp s = istack_new(1); //ここがよくわからない。試しに1を入れてます
  for(int i = 0; t[i] != '\0'; ++i) {
    char c = t[i];
    istack_push(s, c); //スタックに追加
    if(istack_full(s)) { return true; } //istack_fullの結果がtrueならtrueを返し「いっぱい」を出力
  }
}

int main(int argc, char *argv[]) {
  printf("%s\n", test_of_fullstack(argv[1])?"いっぱい":"まだ余裕あり");
  return 0;
}

わからないこと

1

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

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

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


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

試したこと

コンパイル
$ gcc8 istack.c test_of_fullstack.c
実行
2で(1)としたとき
$ ./a.out 012345678
いっぱい
$ ./a.out 012345
まだ余裕あり

(10)としたとき
$ ./a.out 012345678
いっぱい
$ ./a.out 012345
まだ余裕あり


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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

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/30 00:31

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

    キャンセル

0

struct istack;

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/04/28 18:37

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

    キャンセル

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る