数据结构(栈)

本文详细介绍了顺序栈和链栈这两种数据结构,包括它们的初始化、元素的推入与删除、栈顶元素获取以及获取栈内最小值的方法。同时提供了C语言的实现示例。
摘要由CSDN通过智能技术生成

数据结构(栈)

栈是一种仅限在数据末尾进行增加和减少数据的数据结构,其特点为先进后出(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;

  }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值