--- 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);
の意味が分からなかった。