1. 程式人生 > >c語言棧的實現

c語言棧的實現

棧的定義:棧是一個先入後出表,類似於食堂阿姨放盤子和取盤子的過程。對棧的操作必須放在最新的元素上,即棧頂元素。

用物理線性解構實現棧的操作:

首先定義一個結構體作為棧的控制頭

typedef struct SeqStack{
	int maxRoom;//棧的最大容量
	USER_TYPE *data;//棧儲存空間的首地址
	int top;//棧頂指標
}PSeqStack;
棧的初始化操作:
int creatEmptyStack(PSeqStack **stack, int maxRoom)
{
	if(*stack != NULL){
		printf("棧存在,不能初始化");
		return FALSE;
de	}//如果指向結構體PSeqStack的指標不是NULL,則證明不能初始化

	(*stack) = (PSeqStack*)malloc(sizeof(PSeqStack));//申請控制頭的空間
	(*stack)->maxRoom = maxRoom;//最大元素數量是maxRoom
	(*stack)->top = -1;//top指向的值是-1
	(*stack)->data = (USER_TYPE*)malloc(sizeof(USER_TYPE)*maxRoom);//申請陣列元素空間
	return TRUE;		
}
棧的判空操作
int isEmptyStack(PSeqStack stack)
{
	if(stack.top == -1)//空
		return TRUE;
	else //非空
		return FALSE;
}
棧的判滿操作
int isFullStack(PSeqStack stack)//棧滿返回真,否則返回假
{
	printf("stack.maxRoom = %d, stack.top = %d\n", stack.maxRoom, stack.top );
	if (stack.top == stack.maxRoom-1)//棧為滿時候,指標指向最後一個元素的		return TRUE;
		return TRUE;
	return FALSE;	
										//下標為maxRoom-1
}

入棧操作:
int push(PSeqStack *stack, USER_TYPE data)
{
	if(isFullStack(*stack))//首先看棧是否已滿
	{
		printf("棧已滿,不能入棧");
		return FALSE;
	}
	stack->top++;//棧頂指標上移
	stack->data[stack->top] = data;//入棧
	return TRUE;
}
出棧操作:
int pop(PSeqStack *stack, USER_TYPE *data)
{
	if(isEmptyStack(*stack) == TRUE){
		printf("棧空了,讀不出來");
		return FALSE;
	}
	*data = stack->data[stack->top];//刪除的元素放到data中
	stack->top--;//棧頂元素下移
	return TRUE;
}

讀棧頂元素
int readTop(PSeqStack stack)
{
	if(isEmptyStack(stack) == TRUE)
	{
		printf("棧空了,不能讀了\n");
		return FALSE;
	}
	return stack.data[stack.top];
}
銷燬棧
void destoryStack(PSeqStack **stack)
{
	if(*stack != NULL)//指向控制頭的指標不等於NULL,即棧存在
	{
		if((*stack)->data != NULL)
		{
			free((*stack)->data);
			free(*stack);
		}
	}
}