--- title: 『新版 C言語によるアルゴリズムとデータ構造』 author: kazu634 date: 2008-05-12 wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:4005;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - C - Programming ---

 第四章になりました。スタックとキューです。いまいち良く理解できていませんが、とりあえずこれでスタックが実装で着るみたいです。

#include <stdio.h>
#include <stdlib.h>
/* スタックを実現する構造体 */
typedef struct
{
int max; 			/* スタックのサイズ */
int ptr;			/* スタックポインタ */
int *stk;			/* スタック(の先頭要素へのポインタ) */
} Stack;
/* initializing the stack */
int StackAlloc(Stack *s, int max)
{
s->ptr = ;
/* 配列の確保に失敗した場合 */
if ((s->stk = calloc(max, sizeof(int))) == NULL) {
s->max = ;
return(-1);
}
s->max = max;
return();
}
/* Free the memory the stack occupies */
void StackFree(Stack *s)
{
if (s->stk != NULL) {
free(s->stk);
s->max = s->ptr = ;
}
}
/* Push the data into the stack */
int StackPush(Stack *s, int x)
{
if (s->ptr >= s->max) return(-1);
s->stk[s->ptr++] = x;
return();
}
/* Pop the data from the stack */
int StackPop(Stack *s, int *x)
{
/* スタックが空の時 */
if (s->ptr <= ) return(-1);
*x = s->stk[--s->ptr];
return();
}
/* Peek the stack */
int StackPeek(const Stack *s, int *x)
{
if (s->ptr <= ) return(-1);
*x = s->stk[s->ptr - 1];
return();
}
/* Get the size of the stack */
int StackSize(const Stack *s)
{
return(s->max);
}
/* The numbers of the data inside the stack */
int StackNo(const Stack *s)
{
return(s->ptr);
}
/* Is the stack empty? */
int StackIsEmpty(const Stack *s)
{
return(s->ptr <= );
}
/* Is the stack full? */
int StackIsFull(const Stack *s)
{
return(s->ptr >= s->max);
}
/* Clearing the Stack */
void StackClear(Stack *s)
{
s->ptr = ;
}
int main(void)
{
Stack s;
if (StackAlloc(&s, 100) == -1) {
puts("Try to allocate the memory, but failed...");
return(1);
}
while (1) {
int m, x;
printf ("現在のデータ数: %d / %d\n", StackNo(&s), StackSize(&s));
printf ("(1) Push (2) Pop (0) Quit: ");
scanf("%d", &m);
if (m == ) break;
switch (m) {
case 1: printf ("Data: ");
scanf("%d", &x);
if (StackPush(&s, x) == -1) puts("Failed Pushing the data");
break;
case 2: if (StackPop(&s, &x) == -1) puts("Cannot Pop the data");
else printf ("Pop %d into the stack.\n", x);
break;
}
}
StackFree;
return();
}

気になった部分

int *x;
x = calloc(適当な値, sizeof(int));

こいつは動的に配列の領域を確保しているのだろう。

よく分からなかった部分

return (s->ptr <= );
return (s->ptr >= s->max);

の意味が分からなかった。