ふじ@メガネボーイズのメモのような日記 RSSフィード

2009-08-21

汎用的なスタックをC言語で

前回に引き続き「汎用的なをC言語で」シリーズ。

OSが提供する機能を使わないようなローレイヤー向けの汎用スタックを作ってみた。

データとして整数値/アドレスのどちらでも格納できること、

スタック用のメモリ領域を自由に設定できることが特徴。

(datatype.hは環境に合わせて書き換えてね)

datatype.h

キューと同じ。⇒http://meganeboy.g.hatena.ne.jp/fuji_ttt/20090804

stack.h

#ifndef __STACK_H__
#define __STACK_H__

#include "datatype.h"

/* スタック構造体 */
typedef struct {
	VP_INT	*p_data;	/* データ配列の先頭アドレス */
	UINT	num;		/* 格納されているデータ数 */
	UINT	depth;		/* スタックの深さ(最大データ数) */
} STACK;

/* スタック初期化 */
ER stack_initialize(STACK *p_stack, VP_INT a_data[], UINT depth);

/* プッシュ */
ER stack_push(STACK *p_stack, VP_INT data);

/* ポップ */
ER stack_pop(STACK *p_stack, VP_INT *p_data);

#endif /* __STACK_H__ */

stack.c

#include "datatype.h"
#include "stack.h"

ER stack_initialize(STACK *p_stack, VP_INT a_data[], UINT depth) {
	/* 引数が不正な場合はE_PARを返却 */
	if ( p_stack == NULL || a_data == NULL || depth <= 0 ) {
		return E_PAR;
	}
	
	/* メンバーの初期値を格納 */
	p_stack->p_data = a_data;
	p_stack->num = 0;
	p_stack->depth = depth;
	
	/* 初期化できた場合はE_OKを返却 */
	return E_OK;
}

ER stack_push(STACK *p_stack, VP_INT data) {
	/* 引数が不正な場合はE_PARを返却 */
	if ( p_stack == NULL ) {
		return E_PAR;
	}
	
	/* スタックが満杯の場合はプッシュせずにE_OBJを返却 */
	if ( p_stack->num >= p_stack->depth ) {
		return E_OBJ;
	}
	
	/* スタックに格納 */
	p_stack->p_data[p_stack->num] = data;
	p_stack->num++;
	
	/* プッシュできた場合はE_OKを返却*/
	return E_OK;
}

ER stack_pop(STACK *p_stack, VP_INT *p_data) {
	/* 引数が不正な場合はE_PARを返却 */
	if ( p_stack == NULL || p_data == NULL) {
		return E_PAR;
	}
	
	/* スタックが空の場合は何もせずにE_OBJを返却 */
	if ( p_stack->num == 0 ) {
		return E_OBJ;
	}
	
	/* トップのデータを取り出して指定されたアドレスに格納 */
	*p_data = p_stack->p_data[p_stack->num-1];
	
	/* 格納されているデータ数を更新 */
	p_stack->num--;
	
	/* ポップできた場合はE_OKを返却 */
	return E_OK;
}

jvdfrgzwvxjvdfrgzwvx2014/01/19 02:32ddjffnfhbofcpz, <a href="http://www.rfhbisblww.com/">lwwyimaspn</a>

osqlhymyrvosqlhymyrv2014/01/21 16:24gjcyqnfhbofcpz, <a href="http://www.wkhjvgxhes.com/">znmldtctdb</a>

eebuwgzjdieebuwgzjdi2014/01/24 18:09fqgognfhbofcpz, http://www.iosmxaiqvf.com/ gjcujgfpab

guuhpdpqyrguuhpdpqyr2014/01/29 21:03upsynnfhbofcpz, <a href="http://www.cjikclonds.com/">vhwnmephfp</a> , [url=http://www.qfjfzqiuhh.com/]gzqzcyntls[/url], http://www.nzeockmese.com/ vhwnmephfp

xjjfnhslfhxjjfnhslfh2014/06/02 18:00sclcpnfhbofcpz, <a href="http://www.nnevhzeaoy.com/">vgegvytadw</a> , [url=http://www.ecyvzziytg.com/]wgxpnrpgeu[/url], http://www.jmisxysenl.com/ vgegvytadw