cj_stack.c

来自「堆栈等代码」· C语言 代码 · 共 129 行

C
129
字号
/******************************************************************************/
/*                                                                            */
/*  文件名:CJ_STACK.C    	                                              	  */
/*  创建人:江华                                                              */
/*  日  期:2005-06-09                                                        */
/*  描  述:堆栈函数组文件 	                                              	  */
/*                                                                            */
/*                                                                            */
/*  修改人:                                                                  */
/*  日  期:                                                                  */
/*  描  述:                                                                  */
/*                                                                            */
/******************************************************************************/
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include "cj_stack.h"
const char CJSKErrMsg[][100] = 
{
		"",
		"(1) 堆栈初始化失败.",				
		"(2) 堆栈已空.",				
		"(3) 分配新堆栈结点失败.",		
		"(4) 释放栈结点失败.",				
		"(5) 销毁栈空间失败."
};//错误消息

/*堆栈初始化*/
int CJSKInitial(PTCJSKStack v_sk, TCJUINT4 v_size,TCJUINT4 v_initial, 
	TCJUINT4 v_next,TCJUINT4 v_maxexts,PTCJEMStack v_stack)
{
	if(CJRSInitial(&(v_sk->enodes),sizeof(TCJSKElemNode)+v_size,1,1,v_initial,
		v_next,v_maxexts,NULL,NULL,v_stack)==YCJERROR)
	{
		CJEMPush(v_stack,5,1,'Z',"STK",1,__LINE__,__FILE__,CJSKErrMsg[1]);
		return YCJERROR;
	}
	v_sk->stack_b=NULL;
	v_sk->stack_t=NULL;
	v_sk->stackcount=0;
	v_sk->nodesize=sizeof(TCJSKElemNode);
	v_sk->datasize=v_size;
	return YCJOK;
}

/*取栈顶元素*/
int CJSKGetTop(PTCJSKStack v_sk, void **v_ptr,PTCJEMStack v_stack)
{
	if(v_sk->stack_t==NULL)
	{
		CJEMPush(v_stack,5,1,'Z',"STK",2,__LINE__,__FILE__,CJSKErrMsg[2]);
		return YCJERROR;
	}
	memcpy(*v_ptr,(char *)v_sk->stack_t+v_sk->nodesize,v_sk->datasize);
	return YCJOK;
}

/*压栈*/
int CJSKPush(PTCJSKStack v_sk, void * v_ptr, PTCJEMStack v_stack)
{
	PTCJSKElemNode psen;
	if((psen=(TCJSKElemNode *)CJRSAlloc(&(v_sk->enodes),NULL,v_stack))==NULL)
	{
		CJEMPush(v_stack,5,1,'Z',"STK",3,__LINE__,__FILE__,CJSKErrMsg[3]);
		return YCJERROR;
	}
	memcpy((char *)psen+v_sk->nodesize,v_ptr,v_sk->datasize);
	psen->prev=v_sk->stack_t;
	psen->next=NULL;
	if(v_sk->stack_t!=NULL)
		v_sk->stack_t->next=psen;
	v_sk->stack_t=psen;
	if(v_sk->stack_b==NULL)
		v_sk->stack_b=psen;
	v_sk->stackcount++;
	return YCJOK;
}

/*出栈*/
int CJSKPop(PTCJSKStack v_sk, void **v_ptr, PTCJEMStack v_stack)
{
	PTCJSKElemNode psen;
	if(v_sk->stack_t==NULL)
	{
		CJEMPush(v_stack,5,1,'Z',"STK",2,__LINE__,__FILE__,CJSKErrMsg[2]);
		return YCJERROR;
	}
	memcpy(*v_ptr,(char *)v_sk->stack_t+v_sk->nodesize,v_sk->datasize);
	psen=v_sk->stack_t;
	if(v_sk->stack_t==v_sk->stack_b)
	{
		v_sk->stack_t=NULL;
		v_sk->stack_b=NULL;
	}
	else
	{
		v_sk->stack_t=v_sk->stack_t->prev;
	}
	--v_sk->stackcount;
	if(CJRSFree(&(v_sk->enodes),psen,NULL,v_stack)==YCJERROR)
	{
		CJEMPush(v_stack,5,1,'Z',"STK",4,__LINE__,__FILE__,CJSKErrMsg[4]);
		return YCJERROR;
	}
	return YCJOK;
}

/*栈是否空*/
int CJSKStackEmpty(PTCJSKStack v_sk, PTCJEMStack v_stack)
{
	if(v_sk->stackcount==0)
		return YCJOK;
	return YCJERROR;
}

/*销毁栈*/
int CJSKDestroy(PTCJSKStack v_sk, PTCJEMStack v_stack)
{
	if(CJRSDestroy(&(v_sk->enodes),v_stack)==YCJERROR)
	{
		CJEMPush(v_stack,5,1,'Z',"STK",5,__LINE__,__FILE__,CJSKErrMsg[5]);
		return YCJERROR;
	}
	v_sk->stack_b=NULL;
	v_sk->stack_t=NULL;
	v_sk->stackcount=0;
	return YCJOK;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?