配列を用いたスタックの実現
/* Stack */
#include <stdio.h>
#define BUFSIZE 256
#define DATANUM 10 /* 配列のサイズ(最大データ数) */
/* スタックデータ */
int data[DATANUM] = { 123, 106, 777, 580, 216 };
/* データの個数 */
int datanum = 5; /* datanum-1 がスタックトップのインデックスを表す */
void dispstack();
int push( int n );
int pop( int *n );
main()
{
char buf[BUFSIZE];
int n, i;
while(1)
{
dispstack();
printf("[MENU] u:プッシュ(Push)、o:ポップ(Pop)、c:全消去、q:終了\n");
fgets( buf, BUFSIZE, stdin );
switch( buf[0] )
{
case 'u':
case 'U': /* データをプッシュ */
if( push( n = inputdata() ) < 0 )
printf("スタックが一杯で、Pushできませんでした。\n");
else
printf("データ %d をPushしました。\n", n );
break;
case 'o':
case 'O': /* データをポップ */
if( pop( &n ) < 0 )
printf("スタックが空で、Popできませんでした。\n");
else
printf("Popしたデータは %d でした。\n", n );
break;
case 'c': /* 全データ削除 */
datanum = 0;
printf("全てのデータを消去しました。\n");
break;
case 'q':
case 'Q': /* 終了 */
exit(1);
default:
continue;
}
}
}
/* 全データを表示する関数 */
void dispstack()
{
int i;
for( i = 0; i == 0 || i < datanum; i++ )
printf(" <%2d>", i );
if( i == datanum )
printf("←TOP");
printf("\n");
for( i = 0; i < datanum; i++ )
printf("%5d", data[i] );
printf("\n");
}
/* データをキー入力する関数 */
int inputdata()
{
char buf[BUFSIZE];
int n;
do {
printf("データを入力して下さい:");
fgets( buf, BUFSIZE, stdin );
} while( sscanf( buf, "%d", &n ) != 1 );
return( n );
}
/*
引数で与えられたデータをPush(配列の最後の要素の次に挿入)する関数
当初の配列のサイズを越えて挿入(Push)できない場合は -1 を返す
*/
int push( int n )
{
/* さー考えよう! */
}
/*
スタックトップをPop(配列の最後の要素を削除)して、
引数で与えられた場所にその値を格納する関数
配列(スタック)が空で削除(Pop)できない場合は -1 を返す
*/
int pop( int *n )
{
/* さー考えよう! */
}
/* end of stack0.c */