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

05.【数据结构-C语言】栈(先进后出,栈的实现:进栈、出栈、获取栈顶元素,栈实现代码,括号匹配问题)

目录

1. 栈的概念及结构

2. 栈的实现(数组)

2.1 栈的实现方式(数组 or 链表)

2.2 栈结构体声明

2.3 初始化&销毁(top初始化为0)

2.4 进栈(压栈)(尾插)

2.5 出栈(尾删)

2.6 获取栈顶元素

2.7 判空

2.8 获取栈元素个数

3. 栈实现完整版代码

4. 栈相关题目(括号匹配问题)


1. 栈的概念及结构

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

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

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

2. 栈的实现(数组)

2.1 栈的实现方式(数组 or 链表)

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

数组实现栈
链表实现栈

2.2 栈结构体声明

        和顺序表类似,多了一个top来进行栈顶相关操作。

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>typedef int STDataType;
typedef struct Stack
{STDataType* a;	// 栈数组指针int top;		// top为实际栈顶下标+1int capacity;	// 栈空间大小
}ST;

2.3 初始化&销毁(top初始化为0)

        栈顶定义有两种方式:

        top初始化为-1,即top指的是栈顶元素的下标。

        top初始化为0,即top指的是栈顶元素的下标+1,即栈的数据个数。(此方法比较好)


// 栈初始化和销毁
void STInit(ST* pst)
{assert(pst);	// assert防止传入空指针assert(NULL)pst->a = NULL;pst->top = 0;	// top指向数据的下一个元素pst->capacity = 0;
}void STDestory(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->top = pst->capacity = 0;
}

2.4 进栈(压栈)(尾插)

// 入栈
void STPush(ST* pst, STDataType x)
{assert(pst);if (pst->capacity == pst->top)	// 当栈顶空见满时,扩容{int newcapacity = pst->capacity == 0 ? 4 : 2 * pst->capacity;STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newcapacity);if (tmp == NULL){perror("realloc");exit(1);}pst->a = tmp;pst->capacity = newcapacity;}pst->a[pst->top++] = x;	// top++,注意此时top为实际栈顶下标+1
}

2.5 出栈(尾删)

        出栈只需要判断是否栈中还有数据,然后对top--即可。

// 出栈
void STPop(ST* pst)
{assert(pst && pst->a && pst->top >0);pst->top--;
}

2.6 获取栈顶元素

        获取下标为top-1的元素。top为实际栈顶下标+1。

// 获取栈顶元素
STDataType STTop(ST* pst)
{assert(pst && pst->a && pst->top > 0);return pst->a[pst->top-1];
}

2.7 判空

// 判空
bool STEmpty(ST* pst)
{assert(pst);return pst->top == 0;
}

2.8 获取栈元素个数

        数组末尾元素下标+1=top,即为栈元素个数。

// 获取栈元素个数
int STSize(ST* pst)
{return pst->top;
}

3. 栈实现完整版代码

        【免费】栈-C语言实现完整版代码资源-CSDN下载

4. 栈相关题目(括号匹配问题)

        括号匹配OJ

http://www.dtcms.com/a/323360.html

相关文章:

  • 分布式事务Seata TCC模式篇
  • 【代码篇】关于PartiallyPassword插件_实现文章加密
  • 不同类型模型的样本组织形式
  • 机器翻译:FastText算法详解与Python的完整实现
  • Java-线程线程的创建方式
  • 十九、MySQL-DQL-基本查询
  • 校招秋招春招实习快手在线测评快手测评题库|测评解析和攻略|题库分享
  • 【unitrix数间混合计算】2.10 小数部分特征(bin_frac.rs)
  • 【和春笋一起学C++】(三十三)名称空间的其他特性
  • 小米开源大模型 MiDashengLM-7B:不仅是“听懂”,更能“理解”声音
  • B.10.01.5-电商系统的设计模式应用实战
  • 制作浏览器CEFSharp133+X86+win7 之 javascript交互(二)
  • Javaweb - 14.1 - 前端工程化
  • 从依赖外部提示的显式思维链(CoT),到内部自洽的内化推理(Internalized Reasoning)
  • ConcurrentHashMap源码详解
  • 虚拟手机号工具使用
  • 年轻新标杆!东方心绣脸韧带年轻技术升级发布
  • 基于大语言模型的智能问答系统研究
  • 谷歌官方性能文档:Android 动态性能框架优化Performance Hint API
  • Go 实用指南:如何执行 Skyline 查询(Pareto 最优点筛选)
  • [激光原理与应用-201]:光学器件 - 增益晶体 - 概述
  • Dell PowerEdge: Servers by generation (按代系划分的服务器)
  • leetcode 283. 移动零 - java
  • 【12】 神经网络与深度学习(下)
  • [激光原理与应用-204]:光学器件 - LD激光二极管工作原理以及使用方法
  • 网络超时处理与重试机制:Go最佳实践
  • 【R语言】多样本单细胞分析_SCTransform+Harmony方案(2)
  • Q-learning强化算法万字详解
  • 【工作流引擎】Flowable 和 Activiti
  • 《算法导论》第 15 章 - 动态规划