不会有人2022年还不懂栈吧?

,我又来了。

注意、注意 这可能是你目前为止看到的最细节的关于线性表中的栈的博文了

所以,一定要认真学哦!!!

学完之后,你肯定能学会栈的。要是学不会,就多看几遍啦!

一定要坚持看完,一分耕耘一分收获哦


1.栈的概念及结构

 2.栈的实现

 3.代码的实现

 1.栈的概念及结构

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

注:栈就跟枪膛一样,先进的后发射,后进的先发射

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

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

注:压栈,出栈它们都是在栈顶进行操作

压栈:

出栈:

 总之大家一定要记住入栈,出栈都是在栈顶操作,它们都满足一个特征都是后进先出


2.栈的实现

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

顺序存储:

链式存储:


3.代码实现

test.c:测试文件

#define  _CRT_SECURE_NO_WARNINGS 1
#include"stack.h"
int main()
{
	ST st;//定义了一个ST结构体的变量
	StackInit(&st);
	StackPush(&st, 1);
	StackPush(&st, 2);
	StackPush(&st, 3);
	printf("%d ", StackTop(&st));
	StackPop(&st);
	StackPush(&st, 4);
	printf("%d ", StackTop(&st));
	StackPop(&st);
	StackPush(&st, 5);
	StackPush(&st, 6);

	while (!StackEmpty(&st))
	{
		printf("%d ", StackTop(&st));
		StackPop(&st);
	}

	StackDestory(&st);
	return 0;
}

stack.h:头文件

#define  _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<stdbool.h>
#include<assert.h>
#include<stdlib.h>

typedef int STDataType;

typedef struct Stack
{
	STDataType *a;
	int top;//栈顶元素的下标
	int capacity;//空间大小
}ST;

//初始化
void StackInit(ST* ps);
//销毁
void StackDestory(ST* ps);
//在栈顶插入(入栈)
void StackPush(ST* ps, STDataType x);
//在栈顶删除(出栈)
void StackPop(ST* ps); 
//取栈顶的数据
STDataType StackTop(ST* ps);
//栈的元素
int StackSize(ST* ps);
//判断栈是否为空
bool StackEmpty(ST* ps);

头文件里面包含了库函数的声明,类型重定义,结构体类型,自定义函数.

那接下来我们就来实现头文件中的自定义函数的功能吧!!!

前方高能,请注意,注意  打起精神

初始化:

//初始化
void StackInit(ST* ps)
{
	assert(ps);
	STDataType tmp = (STDataType)malloc(sizeof(STDataType)* 4);
	if (tmp == NULL)
	{
		assert(tmp);
	}
	ps->a = tmp;
	ps->capacity = 4;
	ps->top = 0;
}

首先开辟了4个STDataType这么大的空间,如果开辟成功就把这个开辟空间的首地址赋给ps->a,ps->capacity记录当前空间的大小,ps->top栈中元素个数

销毁栈:

//销毁
void StackDestory(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->top = ps->capacity = 0;
}

直接用free释放ps->a,然后让ps->a为NULL

让ps->top  ps->capacity  记录元素个数和空间大小都改为0

入栈:

//在栈顶插入(入栈)
void StackPush(ST* ps, STDataType x)
{
	if (ps->top == ps->capacity)
	{
		STDataType tmp = realloc(ps->a, ps->capacity*sizeof(STDataType)* 2);
		if (tmp == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		else
		{
			ps->a = tmp;
			ps->capacity *= 2;
		}
	}
	ps->a[ps->top] = x;
	ps->top++;
}

首先判断栈是否需要增容,然后进行插入

出栈:

//在栈顶删除(出栈)
void StackPop(ST* ps)
{
	assert(ps);
	//栈空了,调用Pop,直接中止程序
	assert(ps->top);

	ps->top--;
}

入栈、出栈都是从栈顶执行

取栈顶元素:

//取栈顶的数据
STDataType StackTop(ST* ps)
{
	assert(ps);
	assert(ps->top > 0);
	return ps->a[ps->top - 1];
}

先判断栈中是否有数据,要是有直接返回栈顶,要是ps->top==0,那么ps->top就是栈顶

栈的元素:

//栈的元素
int StackSize(ST* ps)
{
	assert(ps);
	return ps->top;
}

ps->top就是栈中元素的个数,因为是按数组进行存储的下标从0开始,所以ps->top就是元素个数

判断栈是否为空:

//判断栈是否为空
bool StackEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}

ps->top==0它就代表着空


你们有get到吗???

QQ:2186529582​​​

猜你喜欢

转载自blog.csdn.net/m0_66488562/article/details/123550382