2019-03-31 11:00:21 +00:00
---
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
---
< div class = "section" >
< p >
第四章になりました。スタックとキューです。いまいち良く理解できていませんが、とりあえずこれでスタックが実装で着るみたいです。
< / p >
< pre class = "syntax-highlight" >
< span class = "synPreProc" > #include < / span > < span class = "synConstant" > < stdio.h> < / span >
< span class = "synPreProc" > #include < / span > < span class = "synConstant" > < stdlib.h> < / span >
< span class = "synComment" > /* スタックを実現する構造体 */< / span >
< span class = "synType" > typedef< / span > < span class = "synType" > struct< / span >
{
< span class = "synType" > int< / span > max; < span class = "synComment" > /* スタックのサイズ */< / span >
< span class = "synType" > int< / span > ptr; < span class = "synComment" > /* スタックポインタ */< / span >
< span class = "synType" > int</ span > *stk; <span class="synComment">/* スタック(の先頭要素へのポインタ) */</ span >
} Stack;
< span class = "synComment" > /* initializing the stack */< / span >
< span class = "synType" > int< / span > StackAlloc(Stack *s, < span class = "synType" > int< / span > max)
{
s-> ptr = < span class = "synConstant" > < / span > ;
< span class = "synComment" > /* 配列の確保に失敗した場合 */< / span >
< span class = "synStatement" > if< / span > ((s-> stk = calloc(max, < span class = "synStatement" > sizeof< / span > (< span class = "synType" > int< / span > ))) == < span class = "synConstant" > NULL< / span > ) {
s-> max = < span class = "synConstant" > < / span > ;
< span class = "synStatement" > return< / span > (-< span class = "synConstant" > 1< / span > );
}
s-> max = max;
< span class = "synStatement" > return< / span > (< span class = "synConstant" > < / span > );
}
< span class = "synComment" > /* Free the memory the stack occupies */< / span >
< span class = "synType" > void< / span > StackFree(Stack *s)
{
< span class = "synStatement" > if< / span > (s-> stk != < span class = "synConstant" > NULL< / span > ) {
free(s-> stk);
s-> max = s-> ptr = < span class = "synConstant" > < / span > ;
}
}
< span class = "synComment" > /* Push the data into the stack */< / span >
< span class = "synType" > int< / span > StackPush(Stack *s, < span class = "synType" > int< / span > x)
{
< span class = "synStatement" > if< / span > (s-> ptr > = s-> max) < span class = "synStatement" > return< / span > (-< span class = "synConstant" > 1< / span > );
s-> stk[s-> ptr++] = x;
< span class = "synStatement" > return< / span > (< span class = "synConstant" > < / span > );
}
< span class = "synComment" > /* Pop the data from the stack */< / span >
< span class = "synType" > int< / span > StackPop(Stack *s, < span class = "synType" > int< / span > *x)
{
< span class = "synComment" > /* スタックが空の時 */< / span >
< span class = "synStatement" > if< / span > (s-> ptr < = < span class = "synConstant" > < / span > ) < span class = "synStatement" > return< / span > (-< span class = "synConstant" > 1< / span > );
*x = s-> stk[--s-> ptr];
< span class = "synStatement" > return< / span > (< span class = "synConstant" > < / span > );
}
< span class = "synComment" > /* Peek the stack */< / span >
< span class = "synType" > int< / span > StackPeek(< span class = "synType" > const< / span > Stack *s, < span class = "synType" > int< / span > *x)
{
< span class = "synStatement" > if< / span > (s-> ptr < = < span class = "synConstant" > < / span > ) < span class = "synStatement" > return< / span > (-< span class = "synConstant" > 1< / span > );
*x = s-> stk[s-> ptr - < span class = "synConstant" > 1< / span > ];
< span class = "synStatement" > return< / span > (< span class = "synConstant" > < / span > );
}
< span class = "synComment" > /* Get the size of the stack */< / span >
< span class = "synType" > int< / span > StackSize(< span class = "synType" > const< / span > Stack *s)
{
< span class = "synStatement" > return< / span > (s-> max);
}
< span class = "synComment" > /* The numbers of the data inside the stack */< / span >
< span class = "synType" > int< / span > StackNo(< span class = "synType" > const< / span > Stack *s)
{
< span class = "synStatement" > return< / span > (s-> ptr);
}
< span class = "synComment" > /* Is the stack empty? */< / span >
< span class = "synType" > int< / span > StackIsEmpty(< span class = "synType" > const< / span > Stack *s)
{
< span class = "synStatement" > return< / span > (s-> ptr < = < span class = "synConstant" > < / span > );
}
< span class = "synComment" > /* Is the stack full? */< / span >
< span class = "synType" > int< / span > StackIsFull(< span class = "synType" > const< / span > Stack *s)
{
< span class = "synStatement" > return< / span > (s-> ptr > = s-> max);
}
< span class = "synComment" > /* Clearing the Stack */< / span >
< span class = "synType" > void< / span > StackClear(Stack *s)
{
s-> ptr = < span class = "synConstant" > < / span > ;
}
< span class = "synType" > int< / span > main(< span class = "synType" > void< / span > )
{
Stack s;
< span class = "synStatement" > if< / span > (StackAlloc(& s, < span class = "synConstant" > 100< / span > ) == -< span class = "synConstant" > 1< / span > ) {
puts(< span class = "synConstant" > " Try to allocate the memory, but failed..." < / span > );
< span class = "synStatement" > return< / span > (< span class = "synConstant" > 1< / span > );
}
< span class = "synStatement" > while< / span > (< span class = "synConstant" > 1< / span > ) {
< span class = "synType" > int< / span > m, x;
printf (< span class = "synConstant" > " 現在のデータ数: </ span >< span class = "synSpecial" > %d</ span >< span class = "synConstant" > / </ span >< span class = "synSpecial" > %d\n</ span >< span class = "synConstant" > " </ span > , StackNo(& s), StackSize(& s));
printf (< span class = "synConstant" > " (1) Push (2) Pop (0) Quit: " < / span > );
scanf(< span class = "synConstant" > " < / span > < span class = "synSpecial" > %d< / span > < span class = "synConstant" > " < / span > , & m);
< span class = "synStatement" > if< / span > (m == < span class = "synConstant" > < / span > ) < span class = "synStatement" > break< / span > ;
< span class = "synStatement" > switch< / span > (m) {
< span class = "synStatement" > case< / span > < span class = "synConstant" > 1< / span > : printf (< span class = "synConstant" > " Data: " < / span > );
scanf(< span class = "synConstant" > " < / span > < span class = "synSpecial" > %d< / span > < span class = "synConstant" > " < / span > , & x);
< span class = "synStatement" > if< / span > (StackPush(& s, x) == -< span class = "synConstant" > 1< / span > ) puts(< span class = "synConstant" > " Failed Pushing the data" < / span > );
< span class = "synStatement" > break< / span > ;
< span class = "synStatement" > case< / span > < span class = "synConstant" > 2< / span > : < span class = "synStatement" > if< / span > (StackPop(& s, & x) == -< span class = "synConstant" > 1< / span > ) puts(< span class = "synConstant" > " Cannot Pop the data" < / span > );
< span class = "synStatement" > else</ span > printf (< span class = "synConstant" > " Pop </ span >< span class = "synSpecial" > %d</ span >< span class = "synConstant" > into the stack.</ span >< span class = "synSpecial" > \n</ span >< span class = "synConstant" > " </ span > , x);
< span class = "synStatement" > break< / span > ;
}
}
StackFree;
< span class = "synStatement" > return< / span > (< span class = "synConstant" > < / span > );
}
< / pre >
< h4 >
気になった部分
< / h4 >
< pre class = "syntax-highlight" >
< span class = "synType" > int< / span > *x;
x = calloc(適当な値, < span class = "synStatement" > sizeof< / span > (< span class = "synType" > int< / span > ));
< / pre >
< p >
こいつは動的に配列の領域を確保しているのだろう。
< / p >
< h4 >
よく分からなかった部分
< / h4 >
< pre class = "syntax-highlight" >
< span class = "synStatement" > return< / span > (s-> ptr < = < span class = "synConstant" > < / span > );
< / pre >
< pre class = "syntax-highlight" >
< span class = "synStatement" > return< / span > (s-> ptr > = s-> max);
< / pre >
< p >
の意味が分からなかった。
< / p >
2019-04-02 16:06:15 +00:00
< / div >