【数据结构】_栈的结构与实现

目录

1. 栈的相关概念与结构

2. 栈的实现

2.1 栈实现的底层结构选择

2.2 Stack.h

2.3 Stack.c

2.4 Test_Stack.c


1. 栈的相关概念与结构

1、栈:一种特殊的线性表,只允许在固定的一端插入和删除数据;

允许进行数据插入和删除操作的一端称为栈顶,另一端称为栈底;

栈中的元素遵守后进先出LIFO(Last In First Out)的原则;

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

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

2. 栈的实现

2.1 栈实现的底层结构选择

1、若采用数组实现栈,则可将数组头视为栈底,数组尾视为栈顶,出入栈都在数组尾进行操作。

2、若采用单链表实现栈,则将链尾视为栈底,入栈利用头插实现,出栈利用头删实现

(若将链首视为栈底,入栈通过尾插实现,但出栈较为麻烦)

3、若采用双链表实现栈,则无论将哪端视为栈底,出栈、入栈等方法的实现都非常方便;

相较而言,数组、单链表的方式均可较为便利实现栈。相对而言数组的实现效果更优,数组在尾上插入数据的效率高且代价小。采用数组实现栈。

2.2 Stack.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
typedef int STDataType;
typedef struct Stack {// 动态开辟数组STDataType* a;// top表示栈顶元素的下一个元素的下标int top;int capacity;
}ST;
void STInit(ST* pst);
void STDestory(ST* pst);
// 压栈
void STPush(ST* pst,STDataType x);
// 出栈
void STPop(ST* pst);
// 获取栈顶数据
STDataType STTop(ST* pst);
// 判空
bool STEmpty(ST* pst);
// 获取栈元素个数
int STSize(ST* pst);

2.3 Stack.c

#include"Stack.h"
// 初始化
void STInit(ST* pst) {assert(pst);pst->a = NULL;// top表示栈顶元素的下一个元素的下标pst->top = 0;// capacity表示栈内元素个数(等价于栈顶元素的下一个元素的下标)pst->capacity = 0;
}
// 销毁
void STDestory(ST* pst) {assert(pst);free(pst->a);pst->a = NULL;pst->capacity = pst->top = 0;
}
// 压栈
void STPush(ST* pst, STDataType x) {assert(pst);// 满则扩容if (pst->top == pst->capacity) {int newCapacity = pst->capacity == 0? 4 : pst->capacity * 2;STDataType* tmp = (STDataType*)realloc(pst->a, newCapacity * (sizeof(STDataType)));if (tmp == NULL) {perror("realloc fail");return;}pst->a = tmp;pst->capacity = newCapacity;}// 入栈数据pst->a[pst->top] = x;pst->top++;
}
// 出栈
void STPop(ST* pst) {assert(pst);// 判栈非空assert(pst->top>0);pst->top--;
}
// 获取栈顶数据
STDataType STTop(ST* pst) {assert(pst);assert(pst->top>0);return pst->a[pst->top - 1];
}
// 判空
bool STEmpty(ST* pst) {if (pst->top == 0) {return true;}return false;//return pst->top == 0;
}
// 获取栈元素个数
int STSize(ST* pst) {assert(pst);return pst->top;
}

2.4 Test_Stack.c

#include"Stack.h"
int main() {ST st;STInit(&st);STPush(&st, 1);STPush(&st, 2);STPush(&st, 3);STPush(&st, 4);while (!STEmpty(&st)) {printf("%d ", STTop(&st));STPop(&st);}STDestory(&st);return 0;
}

注:在使用数组实现栈的方式中,定义栈时的top表示栈顶位置,关于top的具体含义与初始化、销毁、压栈、出栈等操作需要进行对应:

若top表示栈顶元素的下标,则初始化时(栈内无元素),top=-1,插入时在a[top++]处入栈元素;

若top表示栈顶元素的下一个元素的下标,则初始化时top为0,插入时在a[top]处入栈元素

(易有top表示栈顶元素下标,但将top初始化为0的错误写法,注意勿混淆)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/13980.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql的cpu使用率100%问题排查

背景 线上mysql服务器经常性出现cpu使用率100%的告警&#xff0c; 因此整理一下排查该问题的常规流程。 1. 确认CPU占用来源 检查系统进程 使用 top 或 htop 命令&#xff0c;确认是否是 mysqld 进程导致CPU满载&#xff1a;top -c -p $(pgrep mysqld)2. 实时分析MySQL活动 …

某团面试题①—kudu读写流程

kudu 读写流程 前言 为什么会有kudu&#xff1f;先贴一个经典的图。 kudu诞生之前大数据的主要2种方式存储 静态数据 以hdfs引擎作为存储引擎&#xff0c;适用于高吞吐量的离线大数据分析场景&#xff0c;缺点是实现随机读写性能差&#xff0c;更新数据难 动态数据 以Hbase…

Deepseek本地部署指南:在linux服务器部署,在mac远程web-ui访问

1. 在Linux服务器上部署DeepSeek模型 要在 Linux 上通过 Ollama 安装和使用模型&#xff0c;您可以按照以下步骤进行操作&#xff1a; 步骤 1&#xff1a;安装 Ollama 安装 Ollama&#xff1a; 使用以下命令安装 Ollama&#xff1a; curl -sSfL https://ollama.com/download.…

go并发和并行

进程和线程 进程&#xff08;Process&#xff09;就是程序在操作系统中的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff0c;进程是一个动态概念&#xff0c;是程序在执行过程中分配和管理资源的基本单位&#xff0c;每一个进程都有一个自己的地址空间。…

element-ui rate 组件源码分享

评分组件&#xff0c;从三个方面分享&#xff1a; 1、页面结构。 2、组件属性。 3、组件方法。 一、页面结构&#xff1a; 主要有图标的、图标(默认或自定义图标)文字的、图标分数的。 二、属性。 2.1 value 2.2 max 最大分数。 2.3 disabled 是否只读 2.4 allow-half 是…

python学opencv|读取图像(五十六)使用cv2.GaussianBlur()函数实现图像像素高斯滤波处理

【1】引言 前序学习了均值滤波和中值滤波&#xff0c;对图像的滤波处理有了基础认知&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;五十四&#xff09;使用cv2.blur()函数实现图像像素均值处理-CSDN博客 python学opencv|读取图像&#xff08;…

HIVE如何注册UDF函数

如果注册UDF函数的时候报了上面的错误&#xff0c;说明hdfs上传的路径不正确&#xff0c; 一定要用下面的命令 hadoop fs -put /tmp/hive/111.jar /user/hive/warehouse 一定要上传到上面路径&#xff0c;这样在创建函数时&#xff0c;引用下面的地址就可以创建成功

紧跟潮流,将 DeepSeek 集成到 VSCode

Visual Studio Code&#xff08;简称 VSCode&#xff09;是一款由微软开发的免费开源代码编辑器&#xff0c;自 2015 年发布以来&#xff0c;凭借其轻便、强大、且拥有丰富扩展生态的特点&#xff0c;迅速成为了全球开发者的首选工具。VSCode 支持多平台操作系统&#xff0c;包…

HAL库 Systick定时器 基于STM32F103EZT6 野火霸道,可做参考

目录 1.时钟选择(这里选择高速外部时钟) ​编辑 2.调试模式和时基源选择: 3.LED的GPIO配置 这里用板子的红灯PB5 4.工程配置 5.1ms的systick中断实现led闪烁 源码: 6.修改systick的中断频率 7.systick定时原理 SysTick 定时器的工作原理 中断触发机制 HAL_SYSTICK_Co…

DeepSeek与llama本地部署(含WebUI)

DeepSeek从2025年1月起开始火爆&#xff0c;成为全球最炙手可热的大模型&#xff0c;各大媒体争相报道。我们可以和文心一言一样去官网进行DeepSeek的使用&#xff0c;那如果有读者希望将大模型部署在本地应该怎么做呢&#xff1f;本篇文章将会教你如何在本地傻瓜式的部署我们的…

【重新认识C语言----文件管理篇】

目录 ​编辑 -----------------------------------------begin------------------------------------- 引言 1. 文件的基本概念 2. 文件指针 3. 文件的打开与关闭 3.1 打开文件 3.2 关闭文件 4. 文件的读写操作 4.1 读取文件 4.1.1 使用fgetc()读取文件 4.1.2 使用fg…

全面解析String类

一、String 类初相识 在 C 语言的世界里&#xff0c;字符串是以\0结尾的字符集合&#xff0c;为了方便操作&#xff0c;C 标准库提供了一系列str系列的库函数&#xff0c;如strcpy、strcat、strlen等。虽然这些库函数在一定程度上满足了我们对字符串的操作需求&#xff0c;但是…

pycharm 中的 Mark Directory As 的作用是什么?

文章目录 Mark Directory As 的作用PYTHONPATH 是什么PYTHONPATH 作用注意事项 Mark Directory As 的作用 可以查看官网&#xff1a;https://www.jetbrains.com/help/pycharm/project-structure-dialog.html#-9p9rve_3 我们这里以 Mark Directory As Sources 为例进行介绍。 这…

MySQL - 字段内分组

1、MySQL 5.7及之前版本 SELECT A.要显示的字段名称,FIRST_VALUE : A.分组字段名称,last :IF(FIRST_VALUE A.分组字段名称, last 1, 1 ) AS rn,FROM 表1 A,(SELECT last : 0, FIRST_VALUE : NULL ) BORDER BY A.排序字段例&#xff1a;SELECT A.DLR_CODE,A.VAILD_CARD_NO,A.L…

瞬态分析中的时域分析与频域分析:原理、对比与应用指南

目录 一、核心概念区分 二、时域分析&#xff1a;时间维度直接求解 1. 基本原理 2. 关键特点 3. 典型算法 4. 应用案例 三、频域分析&#xff1a;频率维度的等效映射 1. 基本原理 2. 关键特点 3. 典型方法 4. 应用案例 四、对比与选择依据 1. 方法论对比 2. 工程…

【DeepSeek】DeepSeek小模型蒸馏与本地部署深度解析DeepSeek小模型蒸馏与本地部署深度解析

一、引言与背景 在人工智能领域&#xff0c;大型语言模型&#xff08;LLM&#xff09;如DeepSeek以其卓越的自然语言理解和生成能力&#xff0c;推动了众多应用场景的发展。然而&#xff0c;大型模型的高昂计算和存储成本&#xff0c;以及潜在的数据隐私风险&#xff0c;限制了…

安卓/ios脚本开发按键精灵经验小分享

1. 程序的切换 我们经常碰到这样的需求&#xff1a;打开最近的应用列表&#xff0c;选取我们想要的程序。但是每个手机为了自己的风格&#xff0c;样式都有区别&#xff0c;甚至连列表的滑动方向都不一样&#xff0c;我们很难通过模拟操作来识别点击&#xff0c;那么我们做的只…

camera光心检测算法

1.概要 光心检测算法&#xff0c;基于opencv c实现&#xff0c;便于模组厂快速集成到软件工具中&#xff0c;适用于camera模组厂算法评估组装制程镜头与sensor的偏心程度&#xff0c;便于工程师了解制程的问题找出改善方向。 2.技术介绍 下图为camera模组厂抓取的bayer-raw经过…

OpenCV:特征检测总结

目录 一、什么是特征检测&#xff1f; 二、OpenCV 中的常见特征检测方法 1. Harris 角点检测 2. Shi-Tomasi 角点检测 3. Canny 边缘检测 4. SIFT&#xff08;尺度不变特征变换&#xff09; 5. ORB 三、特征检测的应用场景 1. 图像匹配 2. 运动检测 3. 自动驾驶 4.…

Docker安装pypiserver私服

Docker安装pypiserver私服 1 简介 Python开源包管理工具有pypiserver、devpi和Nexus等&#xff0c;pypiserver安装部署比较简单&#xff0c;性能也不错。 搭建pypiserver私服&#xff0c;可以自己构建镜像&#xff0c;也可以使用官网的docker镜像。 # Github地址 https://g…