【数据结构】C语言栈的实现

栈的定义

一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。

栈的基本操作

压栈:栈的插入操作叫做进栈、压栈、入栈,入栈数据在栈顶。
出栈:栈的删除操作叫做出栈。出栈数据也在栈顶。
所以我们可以用链表,顺序表实现栈,但考虑到栈的结构,我们只有尾删和尾插操作,所以用顺序表实现更为方便。
在这里插入图片描述

栈实现

c语言顺序表实现:

栈的定义

typedef int Data;
typedef struct stack{
    
    
	Data* _data;
	int _size;
	int _capacity;
}stack;

栈的初始化

void init(stack* stack){
    
    
	if (stack == NULL){
    
    
		return;
	}
	stack->_data = NULL;
	stack->_capacity = stack->_size = 0;
}

判空(增容)

void checkcapacity(stack* stack){
    
    
	if (stack->_capacity==stack->_size){
    
    
		int newcapacity = stack->_capacity == 0 ? 1 : stack->_capacity * 2;
		stack->_data = (Data*)realloc(stack->_data,sizeof(Data)*newcapacity);
		stack->_capacity = newcapacity;
	}
}

出栈和入栈

//入栈(先进后出)(相当于尾插)
void push(stack* stack, Data data){
    
    
	if (stack == NULL){
    
    
		return;
	}
	checkcapacity(stack);
	stack->_data[stack->_size] = data;
	stack->_size++;
}

//出栈(相当于尾删)
void pop(stack* stack){
    
    
	if (stack == NULL){
    
    
		return;
	}
	if (stack->_size > 0){
    
    
		stack->_size--;
	}
}

栈顶元素

//得到栈顶元素
void stacktop(stack* stack){
    
    
	//如果为空的话返回空,不用判断
	return stack->_data[stack->_size - 1];
}

判空栈

//判断是否为空栈
int empty(stack* stack){
    
    
	if (stack->_size == 0){
    
    
		return 1;
	}
	else if (stack = NULL){
    
    
		return 1;
	}
	else{
    
    
		return 0;
	}
}

看元素个数

int size(stack* stack){
    
    
	if (stack == NULL){
    
    
		return 0;
	}
	return stack->_size;
}

销毁

void destory(stack* stack)
{
    
    
	if (stack == NULL)
	{
    
    
		printf("非法操作\n");
		return;
	}
	stack->_size = 0;
	stack->_capicity = 0;
	free(stack->_data);//先释放堆空间
	stack->_data = NULL;

}

猜你喜欢

转载自blog.csdn.net/zhaocx111222333/article/details/114580813