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

目录

一、栈的原理

二、栈的实现

1.栈的定义

2.栈的初始化

3.入栈

4.出栈

5.获取栈顶元素

6.栈的大小

7.判断栈是否为空

8.栈的销毁


一、栈的原理

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

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

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

数据结构与算法——栈的实现及模拟_第1张图片

栈有一个比较特别的性质,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 error\n");
			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;
}

你可能感兴趣的:(数据结构,数据结构)