7.7 KiB
7.7 KiB
title | author | date | url | wordtwit_post_info | categories | |||
---|---|---|---|---|---|---|---|---|
『新版 C言語によるアルゴリズムとデータ構造』 | kazu634 | 2008-05-12 | /2008/05/12/_989/ |
|
|
第四章になりました。スタックとキューです。いまいち良く理解できていませんが、とりあえずこれでスタックが実装で着るみたいです。
#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);
の意味が分からなかった。