配列を用いたスタックの実現

/* 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 */