数据结构(栈)
栈是一种仅限在数据末尾进行增加和减少数据的数据结构,其特点为先进后出(LIFO)。
其基本操作分为初始化,将元素推入栈,删除栈顶部的元素,获取栈顶部的元素。获取栈中最小元素。
栈分为两种类别,一是基于顺序表的顺序栈,二是基于链表的链栈。
顺序栈数据结构定义
typedef struct {
int* bottom;//栈底指针
int* top;//栈顶指针
int maxsize;
}MinStack;
初始化堆栈对象
//顺序栈`
MinStack* minStackCreate() {
MinStack* obj = (MinStack*)malloc(sizeof(MinStack));//分配栈指针
obj->bottom = (int*)malloc(10001 * sizeof(int));//分配栈内空间
obj->top = obj->bottom;//空栈下防止top为野指针
obj->maxsize = 1001 * sizeof(int);//记录空间最大容量
return obj;
}
将元素val推入栈
void minStackPush(MinStack* obj, int val) {
if (obj->top - obj->bottom < obj->maxsize) {
*obj->top++ = val;//将栈顶指针调整到数据的上一个位置
}
}
删除栈顶元素
void minStackPop(MinStack* obj) {
if (obj->bottom != obj->top) {//判断是否为空
--obj->top;//如果不为空,让top指向栈顶的下一个元素
}
}
获取栈顶元素
int minStackTop(MinStack* obj) {
return *(obj->top - 1);//由于栈顶指向的为栈顶元素的上的一个空间,所有需要减1
}
获取栈内最小值
int minStackGetMin(MinStack* obj) {
int* temp = obj->top - 1;//取得栈顶元素
int min_value = *temp;// 初始化
while (temp != obj->bottom - 1) {//使用临时变量访问,注意栈底也需要访问
if (min_value > *temp) {
min_value = *temp;
}
--temp;
}
return min_value;
}
销毁栈
void minStackFree(MinStack* obj) {
obj->bottom = obj->top = NULL;//将栈顶,栈底指针均置空即可
}
链栈数据结构定义
//链栈
#define MAXSIZE 1000
typedef struct MinStack{
int data;//数据域
struct Mintack* next;//指针域
}MinStack;
初始化堆栈对象
MinStack* minStackCreate() {
MinStack* obj = (MinStack*)malloc(sizeof(MinStack));
obj->next = NULL;//将下一项指针置空,避免野指针
obj->data = 0;
return obj;
}
将元素val推入栈
void minStackPush(MinStack* obj, int val) {
MinStack* p = (MinStack*)malloc(sizeof(MinStack));
p->data = val;//将目标元素赋给节点的数据域。
p->next = obj->next;//插入p节点
obj->next = p;//使头结点的下一结点为p
}
删除栈顶元素
void minStackPop(MinStack* obj) {
MinStack* temp = obj->next;
obj->next = temp->next;`
free(temp);
}
获取栈顶元素
int minStackTop(MinStack* obj) {
return obj->next->data;//注意头节点数据域无效,需要访问下一节点
}
获取栈内最小值
int minStackGetMin(MinStack* obj) {
MinStack* temp = obj->next; //类似的使用临时变量,防止出现问题
int min_value = temp->data;
while(temp != NULL){
if(min_value > temp->data){
min_value = temp->data;
}
temp = temp->next;
}
return min_value;
}
销毁栈
void minStackFree(MinStack* obj) {
MinStack* temp = obj->next;
MinStack* delete_node = obj->next;
if(temp != NULL){
temp = temp->next;
free(delete_node);//注意释放动态分配的空间,避免内存泄露
delete_node = temp;
}
}