数据结构-----栈和队列(栈)

文章介绍了栈的基本概念,包括栈是一种后进先出(LIFO)的线性数据结构,以及栈顶和栈底的定义。接着,文章提供了C语言实现栈的代码,包括栈的初始化、销毁、元素入栈、出栈、获取栈顶元素和判断栈是否为空等基本操作。
摘要由CSDN通过智能技术生成

一.栈的定义和概念

1.栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。 在这里插入图片描述

2.栈顶(Top):线性表允许进行插入删除的那一端。

3.栈底(Bottom):固定的,不允许进行插入和删除的另一端。

4.空栈:不含任何元素的空表。

5.栈具有后进先出的特点,简称LIFO(Last In First Out)

注意:栈是一种用来操作数据的思想,核心是利用其后进先出的特点。

在这里插入图片描述

二.栈的代码实现

typedef int STDataType;
typedef struct Stack
{
	STDataType* a;//用来存放数据
	int top;//栈顶
	int capacity;//栈的容量
}ST;

栈是一种用来操作数据的结构,可以用其他数据结构来表示栈或者模拟栈。

三.栈的常见的基本操作

1.栈的初始化

void StackInit(ST* ps)
{
	assert(ps);
	ps->a = NULL; //栈底为空
	ps->capacity = 0;//栈中容量为0
	ps->top = 0;// 栈顶索引为0
}

2.栈的销毁

void StackDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = ps->top = 0;
}

3.元素入栈

void StackPush(ST* ps, STDataType x)
{
	assert(ps);
		//若顺序表中元素已满,则先动态申请空间
		if(ps->top == ps->capacity)
		{
			int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
			//相当于重新申请开辟newcapacity*sizeof(STDataType)的内存,
			//然后将原来的内存空间的数据拷贝会在,释放旧的内存空间,最后返回新开辟的内存空间的起始地址
			//这里的起始地址为ps->a,让tmp接收新地址
			STDataType* tmp = realloc(ps->a, sizeof(STDataType) * newcapacity);

			//若realloc开辟失败,不能让原内存数据失效,因此退出
			if (tmp == NULL)
			{
				printf("realloc fail");
				exit(-1);
			}
			//将新申请的内存的首地址赋给原来的顺序表的首地址
			ps->a = tmp;

			//将新申请的内存的容量赋给原来顺序表的内存容量
			ps->capacity=newcapacity;
		}

		//将元素入栈
			ps->a[ps->top] = x;
		//栈顶top++
			ps->top++;
}

4.元素出栈

void StackPop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	free(ps->a[ps->top]);
	ps->top--;
}

5.获得栈顶的元素值

STDataType StackTop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	//free(ps->a[ps->top]);为什么不free掉这个的空间
	return ps->a[ps->top-1];
}

6.返回当前栈的元素的个数

int StackSize(ST* ps)
{
	assert(ps);
	
	return ps->top;
}

7.判断栈当前是否为空

bool StackEmpty(ST* ps)
{
	assert(ps);

	//逻辑判断
	return ps->top==0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值