【數據結構】順序棧的基本操作操作---C/C++

本博客所有文章均已遷入到http://www.coderbean.com
//頭文件內容
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 2
struct SqStack
{
	SElemType *base;
	SElemType *top;
	int stacksize;
};


//順序棧的操作
//初始化,清空,壓棧,出棧,遍歷,銷燬
 Status InitStack(SqStack &S)
{
	if(!(A.base=(SElemType *)malloc(STACK_INIT_SIZE)*sizeof(SElemType))))
	{
		exit(OVERFLOW);//儲存分配失敗;
	}
	S.top = S.base;//棧頂和棧底指向同一位置
	S.stacksize = STACK_INIT_SIZE;
	return OK;
}

Status DestroyStack(SqStack &S)
{
    free(S.base);
    S.base = NULL;
    S.top = NULL;
    S.stacksize = 0;
    return OK;
}

Status ClearStack(SqStack &S)
{
	S.top = S.base;
	return OK;
}

Status StackEmpty(SqStack &S)
{
	if(S.top == S.base)
		return TRUE;
	else
		return FALSE;
}

Status StackLength(SqStack &S)
{
	return (S.top - S.base);
}

Status GetTop(SqStack S, ElemType &e)
{
	if(S.top > S.base)//注意判斷當棧不爲空是才能提取棧頂元素
	{
		e = *S.top--;
		return OK;
	}
	else
		return ERROR;
}
Status Push(SqStack &SElemType,ElemType e)
{
	if(S.top - S.base>=S.stacksize)
	{
		S.base = (SElemType*)realloc(S.stacksize + S.base,STACKINCREMENT*sizeof(SElemType));
		//記得要加上原來的容量realloc的用法
		if(!S.base)
		{
			exit(OVERFLOW);
		}
		S.top = S.base + S.stacksize;
		S.stacksize += STACKINCREMENT;
		//注意以上兩條語句的順序
	}
	*++S.top = e;
	return OK;
}

Status Pop(SqStack &S, SElemType *e)
{
	if(S.top == S.base)
		return ERROR;//首先要判斷棧非空
	e = *S.top--;
	return OK;
}
Status StackTraverse(SqStack S, Status(*visit)(SElemType))
{
	while(S.top != S.base)
	{
		visit(*S.base++);
	}
	printf('\n');
	return OK;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章