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

初阶数据结构(C语言实现)——4.1栈

目录

  • 1.栈
    • 1.1栈的概念及结构
    • 1.2 栈的实现
      • 1.1.0 栈的初始化
      • 1.1.1 销毁
      • 1.1.2 入栈
      • 1.1.3 出栈
      • 1.1.4 获取栈中有效元素个数
      • 1.1.5 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
      • 1.1.6 获取栈顶元素
      • 1.1.7 验证
  • 附录 栈的C语言实现源码
    • .h文件
    • .c文件
    • test.c文件

1.栈

1.1栈的概念及结构

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

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

在这里插入图片描述

1.2 栈的实现

在VS2022中新建一个工程

  • stack20250308.h(栈的类型定义、接口函数声明、引用的头文件)
  • stack20250308.c(栈的接口函数的实现)
  • stackTest20250308.c(主函数、测试各个接口功能)

在这里插入图片描述

  • 实现接口
// 支持动态增长的栈
typedef int  STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;
// 初始化栈
void STInit(ST* ps);
//销毁
void STDestroy(ST* ps);
// 入栈,插入
void STPush(ST* ps, STDataType x);
// 出栈,删除
void STPop(ST* ps);
//获取栈中有效元素个数
int STSize(ST* ps);
//检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool STEmpty(ST* ps);
//获取栈顶元素
STDataType STTop(ST* ps);

1.1.0 栈的初始化

在这里插入图片描述

// 初始化栈
void STInit(ST* ps)
{
	assert(ps);
	ps->a = (STDataType*)malloc(sizeof(STDataType)*4);
	if (ps->a == NULL)
	{
		perror("STInit::malloc fail!");
		return;
	}
	ps->capacity = 4;
	ps->top = 0;//top是栈顶元素的下一个位置

	//ps->top =-1;//top是栈顶元素位置
}

1.1.1 销毁

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

1.1.2 入栈

// 入栈,插入
void STPush(ST* ps, STDataType x)
{
	assert(ps);
	if (ps->top == ps->capacity)
	{
		STDataType* tem = (STDataType*)realloc(ps->a,sizeof(STDataType) * ps->capacity*2);//扩容当前的2倍
		if (ps->a == NULL)
		{
			perror("STInit::relloc fail!");
			return;
		}
		ps->a = tem;
		ps->capacity *= 2; //修改容量
	}
	ps->a[ps->top] = x;
	ps->top++;
}

1.1.3 出栈

// 出栈,删除
void STPop(ST* ps)

{
	assert(ps);
	assert(!STEmpty(ps));//检查是否为空,为空就报错,
	ps->top--;//直接--,但是空栈的时候就不能继续--,所以在之前进行是否为空的检查。
}

1.1.4 获取栈中有效元素个数

//获取栈中有效元素个数
int STSize(ST* ps)
{
	assert(ps);
	//top就是size
	return ps->top;
}

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

//检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool STEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}

1.1.6 获取栈顶元素

//获取栈顶元素
STDataType STTop(ST* ps)
{
	assert(ps);

	return ps->a[ps->top - 1];//top是最后一个元素的下一个位置,所以-1
}

1.1.7 验证

  • 验证的时候,我们栈是不能打印的,我们需要一个一个出栈打印栈顶元素
void STTest()
{
    ST st;
    STInit(&st);
    STPush(&st, 1);
    STPush(&st, 2);
    STPush(&st, 3);
    STPush(&st, 4);
    STPush(&st, 5);

    while (!STEmpty(&st))
    {
        printf("%d ", STTop(&st));
        STPop(&st);
    }

    STDestroy(&st);

}

插入
在这里插入图片描述

删除
在这里插入图片描述

栈有效个数验证
在这里插入图片描述

附录 栈的C语言实现源码

.h文件

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

//静态的
//#define N 10
//typedef struct Stack
//{
//	int a[N];
//	int top;
//
//}Stack;

// 支持动态增长的栈
typedef int  STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;
// 初始化栈
void STInit(ST* ps);
//销毁
void STDestroy(ST* ps);
// 入栈,插入
void STPush(ST* ps, STDataType x);
// 出栈,删除
void STPop(ST* ps);
//获取栈中有效元素个数
int STSize(ST* ps);
//检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool STEmpty(ST* ps);
//获取栈顶元素
STDataType STTop(ST* ps);

.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"stack20250308.h"

// 初始化栈
void STInit(ST* ps)
{
	assert(ps);
	ps->a = (STDataType*)malloc(sizeof(STDataType)*4);
	if (ps->a == NULL)
	{
		perror("STInit::malloc fail!");
		return;
	}
	ps->capacity = 4;
	ps->top = 0;//top是栈顶元素的下一个位置

	//ps->top =-1;//top是栈顶元素位置
}


//销毁
void STDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = 0;
	ps->top = 0;
}
// 入栈,插入
void STPush(ST* ps, STDataType x)
{
	assert(ps);
	if (ps->top == ps->capacity)
	{
		STDataType* tem = (STDataType*)realloc(ps->a,sizeof(STDataType) * ps->capacity*2);//扩容当前的2倍
		if (ps->a == NULL)
		{
			perror("STInit::relloc fail!");
			return;
		}
		ps->a = tem;
		ps->capacity *= 2; //修改容量
	}
	ps->a[ps->top] = x;
	ps->top++;
}
// 出栈,删除
void STPop(ST* ps)

{
	assert(ps);
	assert(!STEmpty(ps));//检查是否为空,为空就报错,
	ps->top--;//直接--,但是空栈的时候就不能继续--,所以在之前进行是否为空的检查。
}

//获取栈中有效元素个数
int STSize(ST* ps)
{
	assert(ps);
	//top就是size
	return ps->top;
}
//检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool STEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}
//获取栈顶元素
STDataType STTop(ST* ps)
{
	assert(ps);

	return ps->a[ps->top - 1];//top是最后一个元素的下一个位置,所以-1
}

test.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"stack20250308.h"

void STTest()
{
    ST st;
    STInit(&st);
    STPush(&st, 1);
    STPush(&st, 2);
    STPush(&st, 3);
    STPush(&st, 4);
    STPush(&st, 5);
    STPop(&st);
    STPop(&st);
    int size = STSize(&st);
    printf("栈有效元素为:%d\n", size);
    while (!STEmpty(&st))
    {
        printf("%d ", STTop(&st));
        STPop(&st);
    }
    STDestroy(&st);
}

int main()
{
    STTest();
    return 0;
}

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

相关文章:

  • QT---鼠标事件
  • 【网络】HTTP协议、HTTPS协议
  • 模拟调制技术详解
  • 顶点着色器和片段着色器
  • 无人机推流/RTMP视频推拉流:EasyDSS无法卸载软件的原因及解决方法
  • Android AudioFlinger(四)—— 揭开PlaybackThread面纱
  • react脚手架(creat-react-app)
  • 大数定律详解
  • 回归预测 | Matlab实现GWO-BP-Adaboost基于灰狼算法优化BP神经网络结合Adaboost思想的回归预测
  • 使用Dify+DeepSeek搭建私有知识库
  • STM32入门之I2C总线应用详解(附LM75A温度传感器实战) | 零基础入门STM32第四十九步
  • #UVM# 关于 config_db 机制中的“路径”和“层次”概念剖析
  • 点云数据处理--splat转3dtiles
  • 架构师面试(十一):消息收发
  • ajax之生成一个ajax的demo示例
  • 网络安全 api 网络安全 ast技术
  • 【五.LangChain技术与应用】【9.LangChain ChatPromptTemplate(上):高级对话模板设计】
  • MuBlE:为机器人操作任务规划提供了逼真的视觉观察和精确的物理建模
  • 力扣hot100——多维动态规划
  • MySQL5.7.44-winx64版本Windows Server下载安装教程图解