栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据结构与算法——栈的实现及模拟

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构与算法——栈的实现及模拟

目录

一、栈的原理

二、栈的实现

1.栈的定义

2.栈的初始化

3.入栈

4.出栈

5.获取栈顶元素

6.栈的大小

7.判断栈是否为空

8.栈的销毁


一、栈的原理

堆栈(英语:stack)又称为栈或堆叠,是计算机科学中的一种抽象资料类型,只允许在有序的线性资料集合的一端(称为堆栈顶端,英语:top)进行加入数据(英语:push)和移除数据(英语:pop)的运算。因而按照后进先出(LIFO, Last In First Out)的原理运作。

常与另一种有序的线性资料集合队列相提并论。

堆栈常用一维数组或链表来实现。

栈有一个比较特别的性质,Last In First Out(后进先出)

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

  我们会发现栈这种数据结构只能从一侧入数据,从另一侧出数据

这种特殊的性质决定了只能在栈顶入数据,同时栈没有打印接口,栈不能遍历

我们如果要遍历栈就会打乱栈的顺序

栈可以用来将递归改为非递归

因为如果递归深度过深就会出现栈溢出,所以我们可以用栈将递归改为迭代

二、栈的实现

在实现栈之前,我们要想我们可以用什么来模拟栈呢?

栈的实现一般可以使用数组或者链表来实现,相对而言用数组来模拟实现更优一点

因为数组在尾上插入数据的代价比较小

1.栈的定义

栈,我们用数组来实现,所以在栈的定义时需要定义一个指针来指向栈,同时用下标来访问

,同时还需要栈的容量

typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;

2.栈的初始化

我们初始化时,要将容量与栈顶置为空,指向栈的指针置为NULL

void StackInit(ST* ps)
{
	assert(ps);

	ps->a = NULL;
	ps->capacity = ps->top = 0;

}

3.入栈

入栈,我们就需要先判断容量,然后再插入元素

同时让栈顶指针向后走

void StackPush(ST* ps, STDataType x)
{
	assert(ps);

	if (ps->capacity == ps->top)
	{
		int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newCapacity);
		if (tmp == NULL)
		{
			printf("realloc errorn");
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity = newCapacity;
	}

	ps->a[ps->top] = x;
	ps->top++;
}

4.出栈

需要先判断栈是否为空

出栈就把栈top减减就可以了

void StackPop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));

	ps->top--;
}

5.获取栈顶元素

top指向的元素减1就是栈顶元素

STDataType StackTop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));

	return ps->a[ps->top-1];
}

6.栈的大小

top就是栈的大小

int StackSize(ST* ps)
{
	assert(ps);

	return ps->top;
}

7.判断栈是否为空
bool StackEmpty(ST* ps)
{
	assert(ps);

	return ps->top == 0;
}

8.栈的销毁

void StackDestroy(ST* ps)
{
	assert(ps);

	free(ps->a);

	ps->capacity = ps->top = 0;
	ps->a = NULL;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/879285.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号