スタックについての質問です。
このヘッダの部分でエラーが出てしまいますこのコードはc言語で学ぶアルゴリズムとデータ構造 (柴田望洋著)
という本からの引用です。
#ifndef IntStack
#define IntStack
typedef struct
{
int max;
int ptr;
int *stk;
}IntStack;
int Initialize(IntStack *s, int max);
int Push(IntStack *s, int *x);
int Peek(IntStack *s, int *x);
void Clear(const IntStack *s);
int Capcity(IntStack *s);
int Size(const IntStack *s);
int IsEmpty(const IntStack *s);
int IsFull(const IntStack *s);
int Serach(const IntStack *s, int x);
void Print(const IntStack *s);
void Terminate(IntStack *s);
#endif
エラーの内容は*の前に(がない }がない 型 ”)” と書いてあります。
何分初学者ですのでお手柔らかにお願いします。
スタックについて
Re: スタックについて
このように公開されてたはずです。
IntStack.h
IntStack.c
IntStackTest.c
IntStack.h
/* int型スタックIntStack(ヘッダ部)*/
#ifndef ___IntStack
#define ___IntStack
/*--- スタックを実現する構造体 ---*/
typedef struct {
int max; /* スタックの容量 */
int ptr; /* スタックポインタ */
int *stk; /* スタック本体(の先頭要素へのポインタ) */
} IntStack;
/*--- スタックの初期化 ---*/
int Initialize(IntStack *s, int max);
/*--- スタックにデータをプッシュ ---*/
int Push(IntStack *s, int x);
/*--- スタックからデータをポップ ---*/
int Pop(IntStack *s, int *x);
/*--- スタックからデータをピーク ---*/
int Peek(const IntStack *s, int *x);
/*--- スタックを空にする ---*/
void Clear(IntStack *s);
/*--- スタックの容量 ---*/
int Capacity(const IntStack *s);
/*--- スタック上のデータ数 ---*/
int Size(const IntStack *s);
/*--- スタックは空か ---*/
int IsEmpty(const IntStack *s);
/*--- スタックは満杯か ---*/
int IsFull(const IntStack *s);
/*--- スタックからの探索 ---*/
int Search(const IntStack *s, int x);
/*--- 全データの表示 ---*/
void Print(const IntStack *s);
/*--- スタックの後始末 ---*/
void Terminate(IntStack *s);
#endif
/* int型スタックIntStack(ソース部)*/
#include <stdio.h>
#include <stdlib.h>
#include "IntStack.h"
/*--- スタックの初期化 ---*/
int Initialize(IntStack *s, int max)
{
s->ptr = 0;
if ((s->stk = calloc(max, sizeof(int))) == NULL) {
s->max = 0; /* 配列の生成に失敗 */
return -1;
}
s->max = max;
return 0;
}
/*--- スタックにデータをプッシュ ---*/
int Push(IntStack *s, int x)
{
if (s->ptr >= s->max) /* スタックは満杯 */
return -1;
s->stk[s->ptr++] = x;
return 0;
}
/*--- スタックからデータをポップ ---*/
int Pop(IntStack *s, int *x)
{
if (s->ptr <= 0) /* スタックは空 */
return -1;
*x = s->stk[--s->ptr];
return 0;
}
/*--- スタックからデータをピーク ---*/
int Peek(const IntStack *s, int *x)
{
if (s->ptr <= 0) /* スタックは空 */
return -1;
*x = s->stk[s->ptr - 1];
return 0;
}
/*--- スタックを空にする ---*/
void Clear(IntStack *s)
{
s->ptr = 0;
}
/*--- スタックの容量 ---*/
int Capacity(const IntStack *s)
{
return s->max;
}
/*--- スタックに積まれているデータ数 ---*/
int Size(const IntStack *s)
{
return s->ptr;
}
/*--- スタックは空か ---*/
int IsEmpty(const IntStack *s)
{
return s->ptr <= 0;
}
/*--- スタックは満杯か ---*/
int IsFull(const IntStack *s)
{
return s->ptr >= s->max;
}
/*--- スタックからの探索 ---*/
int Search(const IntStack *s, int x)
{
int i;
for (i = s->ptr - 1; i >= 0; i--) /* 頂上→底に線形探索 */
if (s->stk[i] == x)
return i; /* 探索成功 */
return -1; /* 探索失敗 */
}
/*--- 全データの表示 ---*/
void Print(const IntStack *s)
{
int i;
for (i = 0; i < s->ptr; i++) /* 底→頂上に走査 */
printf("%d ", s->stk[i]);
putchar('\n');
}
/*--- スタックの後始末 ---*/
void Terminate(IntStack *s)
{
if (s->stk != NULL)
free(s->stk); /* 配列を破棄 */
s->max = s->ptr = 0;
}
IntStackTest.c
/* int型スタックIntStackの利用例 */
#include <stdio.h>
#include "IntStack.h"
int main(void)
{
IntStack s;
if (Initialize(&s, 64) == -1) {
puts("スタックの生成に失敗しました。");
return 1;
}
while (1) {
int menu, x;
printf("現在のデータ数:%d / %d\n", Size(&s), Capacity(&s));
printf("(1)プッシュ (2)ポップ (3)ピーク (4)表示 (0) 終了:");
scanf("%d", &menu);
if (menu == 0) break;
switch (menu) {
case 1: /*--- プッシュ ---*/
printf("データ:");
scanf("%d", &x);
if (Push(&s, x) == -1)
puts("\aエラ-:プッシュに失敗しました。");
break;
case 2: /*--- ポップ ---*/
if (Pop(&s, &x) == -1)
puts("\aエラ-:ポップに失敗しました。");
else
printf("ポップしたデータは%dです。\n", x);
break;
case 3: /*--- ピーク ---*/
if (Peek(&s, &x) == -1)
puts("\aエラ-:ピークに失敗しました。");
else
printf("ピークしたデータは%dです。\n", x);
break;
case 4: /*--- 表示 ---*/
Print(&s);
break;
}
}
Terminate(&s);
return 0;
}