前提・実現したいこと
次のプログラムで実装されたスタックがいっぱいかどうか判定する関数
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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/29 15:31