スタック は、「後入れ先出し」のデータ構造です(スタックのTipsで解説)。
C言語プログラムでスタック構造を実現する例として、今回は固定サイズの構造体配列を使った簡易なものを紹介します。
#define STACK_MAX 100
typedef struct {
int idno;
int data;
} stack_t;
stack_t stack[STACK_MAX]; //スタック用の構造体配列
先頭のデータ位置は変数 spt に覚えます。
int spt = -1; //スタックポインタ(空のときは-1)
これをスタック用配列の最後に保存したエントリを指す添字として使います。
スタックが空の状態では、添字の先頭 0 より小さい -1 とします。
// ---- データをスタックに入れる ----
int push( int no, int dt ) {
if( spt >= STACK_MAX-1 ) return -1;
spt++;
stack[spt].idno = no;
stack[spt].data = dt;
return 0;
}
配列のサイズを超えて書き込まないよう先頭でチェックします。"スタックオーバーフロー" になるなら -1 を返しています。
// ---- スタックからデータを取り出す ----
int pop( int *no, int *dt ) {
if( spt < 0 ) return -1;
*no = stack[spt].idno;
*dt = stack[spt].data;
spt--;
return 0;
}
値を取り出したら、スタックポインタをデクリメントします。
データの取り出しといっても、実際にはデータを参照してスタックポインタをずらすだけです。配列要素もクリアしません。次の push で上書きされます。main() { int n, c; push( 10, 'A' ); push( 20, 'B' ); push( 30, 'C' ); if( pop( &n, &c ) == 0 ) printf( "%d, %c\n", n, c ); if( pop( &n, &c ) == 0 ) printf( "%d, %c\n", n, c ); push( 40, 'D' ); if( pop( &n, &c ) == 0 ) printf( "%d, %c\n", n, c ); if( pop( &n, &c ) == 0 ) printf( "%d, %c\n", n, c ); }
[ 関連記事 ] スタック
main() { char hstr[][24] = { "172.3cm", "1.56m", "184.5cm", "1.675m" }, *ep; double d, cmh[4]; //cm単位の身長データ配列 int i; for( i = 0; i < 4; i++ ) { d = strtod( hstr[i], &ep ); //double型に変換不能な部分がepに入る //単位がmなら、dに100を掛けてcm単位へ。そうでなければdのまま if( *ep != '\0' ) cmh[i] = (ep[0]=='m') ? d*100 : d; } }