⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cj_stack.c

📁 堆栈等代码
💻 C
字号:
/******************************************************************************/
/*                                                                            */
/*  文件名: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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -