数据结构->栈

个人主页:小则又沐风a

个人专栏:数据结构

C语言

竞赛专栏

目录

[一 栈的概念和结构](#一 栈的概念和结构)

[二 栈的实现](#二 栈的实现)

[1. 结构定义](#1. 结构定义)

[2. 初始化栈](#2. 初始化栈)

[3. 入栈](#3. 入栈)

[4. 出栈](#4. 出栈)

5.获得栈顶的数据

[6. 获取栈的有效的元素的个数](#6. 获取栈的有效的元素的个数)

7.检测栈是否为空,如果为空返回非零结果,如果不为空返回0

[8. 销毁栈](#8. 销毁栈)


在之前我们讲解了有关链表知识点,下面我们来看另一种数据结构: 栈.

一 栈的概念和结构

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

出栈:栈的删除操作叫做出栈。出数据也在栈顶。

这样看起来栈的结构是不是很像羽毛球桶.

二 栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的 代价比较小.

示意图如上.

现在我们来实现栈的结构.

1. 结构定义
cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int _top; //栈顶
	int _capacity;//容量
}Stack;

我们可以看出来这个栈的结构和顺序表的结构非常相似,

2. 初始化栈
cpp 复制代码
void StackInit(Stack* ps)
{
	ps->a = NULL;
	ps->_capacity = ps->_top = 0;
}
3. 入栈
cpp 复制代码
void StackPush(Stack* ps, STDataType data)
{
	assert(ps);
	if (ps->_top == ps->_capacity)
	{
		int newcapacity = ps->_capacity;
		if (newcapacity == 0)
		{
			newcapacity = 4;
		}
		else
		{
			newcapacity = ps->_capacity * 2;
		}
		STDataType* temp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);
		if (temp == NULL)
		{
			perror("realloc");
			return;
		}
		ps->a = temp;
		ps->_capacity = newcapacity;
	}
	ps->a[ps->_top] = data;
	ps->_top++;
}

在我们入栈的时候,我们先要判断栈的内存是否足够让我们继续添加数据,

也就是这一步,为什么可以这样写呢?

是因为我们在初始化的时候我们将top的数据初始化为了0,

那么top就代表的是栈顶的下一个数据的位置.

然后下面的步骤和顺序表的类似.

4. 出栈
cpp 复制代码
void StackPop(Stack* ps)
{
	assert(ps);
	assert(ps->_top > 0);
	ps->_top--;
}

出栈很简单我们只需要将数据个数减减即可.

注意在数据个数为0的时候我们不能继续出栈了.

5.获得栈顶的数据
cpp 复制代码
STDataType StackTop(Stack* ps)
{
	assert(ps);
	assert(ps->_top > 0);
	return ps->a[ps->_top - 1];
}
6. 获取栈的有效的元素的个数
cpp 复制代码
int StackSize(Stack* ps)
{
	assert(ps);
	return ps->_top;
}
7.检测栈是否为空,如果为空返回非零结果,如果不为空返回0
cpp 复制代码
int StackEmpty(Stack* ps)
{
	assert(ps);
	if (ps->_top == 0)
	{
		return 0;
	}
	else
	{
		return 1;
	}
}
8. 销毁栈
cpp 复制代码
void StackDestroy(Stack* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->_capacity = ps->_top = 0;
}

以上就是我们栈的接口的实现.这个栈看起来难实际上在我们理解过后他就会变的简单了.

之后 我将会讲解数据结构中队列的实现.

谢谢大家的观看!!!

相关推荐
鱼跃鹰飞7 小时前
Leetcode会员尊享100题:270.最接近的二叉树值
数据结构·算法·leetcode
Queenie_Charlie7 小时前
小陶的疑惑2
数据结构·c++·树状数组
Queenie_Charlie9 小时前
小陶与杠铃片
数据结构·c++·树状数组
云深处@10 小时前
【C++】AVL树
数据结构
Yvonne爱编码10 小时前
JAVA数据结构 DAY4-ArrayList
java·开发语言·数据结构
czxyvX12 小时前
016-二叉搜索树(C++实现)
开发语言·数据结构·c++
执着25912 小时前
力扣hot100 - 94、二叉树的中序遍历
数据结构·算法·leetcode
-dzk-12 小时前
【代码随想录】LC 707.设计链表
数据结构·c++·算法·链表
you-_ling13 小时前
数据结构:3.栈和队列
数据结构
梵刹古音14 小时前
【C语言】 递归函数
c语言·数据结构·算法