当前位置: 首页 > article >正文

数据结构---详解栈

一、栈的概念和结构

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

实现栈这样的数据结构使用数组和链表都可以,但是数组的结构更有一点

二、顺序栈的基本操作

1、准备工作

  • 创建三个文件,分别是:
  • 头文件stack.h、源文件stack.c、测试文件test.c
    在这里插入图片描述

2、创建栈的数据结构

typedef int STDataType;
//创建数组结构体
typedef struct Stack {
	STDataType* arr;
	int top;
	int capacity;
}ST;

3、栈的初始化

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

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

4、栈的销毁

void STDestroy(ST* ps)
{
	if (ps->arr != NULL)
	{
		free(ps->arr);
	}
	ps->arr = NULL;
	ps->capacity = ps->top = 0;
}

5、入栈

void StackPush(ST* ps, STDataType x)
{
	assert(ps);
	//空间不够
	if (ps->top == ps->capacity)
	{
		int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity * sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc fail!");
			exit(1);
		}
		ps->arr = tmp;
		ps->capacity = newCapacity;
	}
	//空间足够
	ps->arr[ps->top++] = x;
}

6、判断栈是否为空

bool StackEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}

7、出栈

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

	--ps->top;
}

8、取栈顶元素

STDataType* StackTop(ST* ps)
{
	assert(ps);
	return ps->arr[ps->top - 1];
}

9、有效数据个数

DataType* SizeTop(ST* ps)
{
	assert(ps);
	return ps->top;
}

三、代码总览

stack.h

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

typedef int STDataType;
//创建数组结构体
typedef struct Stack {
	STDataType* arr;
	int top;
	int capacity;
}ST;

//初始化
void STInit(ST* ps);
//栈销毁
void STDestroy(ST* ps);

//入栈
void StackPush(ST* ps, STDataType x);

//判断栈是否为空
bool StackEmpty(ST* ps);
//出栈
void StackPop(ST* ps);

//取栈顶数据
STDataType* StackTop(ST* ps);

//获取栈的有效数据个数
STDataType* SizeTop(ST* ps);

stack.c

#define  _CRT_SECURE_NO_WARNINGS 1
#include"stack.h"

//初始化
void STInit(ST* ps)
{
	assert(ps);

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

//栈销毁
void STDestroy(ST* ps)
{
	if (ps->arr != NULL)
	{
		free(ps->arr);
	}
	ps->arr = NULL;
	ps->capacity = ps->top = 0;
}

//入栈
void StackPush(ST* ps, STDataType x)
{
	assert(ps);
	//空间不够
	if (ps->top == ps->capacity)
	{
		int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity * sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc fail!");
			exit(1);
		}
		ps->arr = tmp;
		ps->capacity = newCapacity;
	}
	//空间足够
	ps->arr[ps->top++] = x;
}

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

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

	--ps->top;
}

//取栈顶元素
STDataType* StackTop(ST* ps)
{
	assert(ps);
	return ps->arr[ps->top - 1];
}

//栈中有效数据个数
STDataType* SizeTop(ST* ps)
{
	assert(ps);
	return ps->top;
}

test.c

#define  _CRT_SECURE_NO_WARNINGS 1
#include"stack.h"

void test()
{
	//初始化
	ST st;
	STInit(&st);

	//入栈
	StackPush(&st, 1);
	StackPush(&st, 2);
	StackPush(&st, 3);
	StackPush(&st, 4);

	//出栈
	/*StackPop(&st);
	StackPop(&st);
	StackPop(&st);
	StackPop(&st);*/

	//出栈打印
	while (!StackEmpty(&st))
	{
		STDataType top = StackTop(&st);
		printf("%d ", top);
		StackPop(&st);
	}

	STDestroy(&st);
}

int main()
{
	test();

	return 0;
}

http://www.kler.cn/a/393011.html

相关文章:

  • redis bind 127.0.0.1和bind 10.34.56.78的区别
  • Jmeter性能测试 -3数据驱动实战
  • 微服务day07
  • 代码 RNN原理及手写复现
  • 2024版本IDEA创建Sprintboot项目下载依赖缓慢
  • 系统上线后发现bug,如何回退版本?已经产生的新业务数据怎么办?
  • 「QT」几何数据类 之 QSize 尺寸类
  • 比ChatGPT更酷的AI工具
  • NVT新能德科技入职测评SHL题库更新:数字推理+演绎推理高分答案、真题解析
  • Pycharm PyQt5 环境搭建创建第一个Hello程序
  • AndroidStudio-滚动视图ScrollView
  • 光驱验证 MD5 校验和
  • Docker解决暴露2375端口引发的安全漏洞
  • 11.12 机器学习-特征工程
  • 工作和学习遇到的技术问题
  • OBOO鸥柏:旗下户外景区自助触摸查询一体机已布局智慧城市便民
  • 汇编分析C++class
  • 【征稿倒计时!华南理工大学主办 | IEEE出版 | EI检索稳定】2024智能机器人与自动控制国际学术会议 (IRAC 2024)
  • LabVIEW大数据处理
  • 网络学习第四篇
  • matlab建模入门指导
  • 【C++】用红黑树封装set和map
  • 【C语言刷力扣】58.最后一个单词的长度
  • 机器学习小补充(加深理解)
  • Matplotlib库中show()函数的用法
  • uniapp内把视频mp4的base64保持到手机文件系统