スタックについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tayuya
記事: 1
登録日時: 5年前

スタックについて

#1

投稿記事 by tayuya » 5年前

スタックについての質問です。
このヘッダの部分でエラーが出てしまいますこのコードは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: スタックについて

#2

投稿記事 by かずま » 5年前

tayuya さんが書きました:
5年前
スタックについての質問です。
このヘッダの部分でエラーが出てしまいますこのコードはc言語で学ぶアルゴリズムとデータ構造 (柴田望洋著)
という本からの引用です。
#ifndef IntStack
#define IntStack
その本には、次のように書いているのではありませんか?

コード:

#ifndef ___IntStackB
#define ___IntStackB
#define IntStack
がダメな理由が分かりますか?

質問するときはフォーラムルールをよく読んで、
コードには codeタグを使ってください。

Math

Re: スタックについて

#3

投稿記事 by Math » 5年前

このように公開されてたはずです。

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
IntStack.c

コード:

/* 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;
}


Math

Re: スタックについて

#4

投稿記事 by Math » 5年前

c.bat

コード:

cl /TC IntStackTest.c Intstack.c

IntStackTest.exe

pause
http://www2.koyoen.birdview.co.jp/~abcxyz/z0819.png

Math

Re: スタックについて

#5

投稿記事 by Math » 5年前

c.bat

コード:

cl /TC IntStackTest.c Intstack.c

IntStackTest.exe

pause
http://www2.koyoen.birdview.co.jp/~abcxyz/z0819.png

返信

“C言語何でも質問掲示板” へ戻る