栈知识梳理和函数实现

参考此文章数据结构——栈,此文章写的更详细,由于我们都是学自于比特课程,这里做个自我备份,方便后续查阅、修改和补充。

栈知识梳理和函数实现

  • 前言
  • 1.栈是什么?
  • 2.栈的接口实现
    • 2.1初始化栈
    • 2.2入栈
    • 2.3 出栈
    • 2.4 获取栈顶元素
    • 2.5 获取栈中有效元素个数
    • 2.6 检测栈是否为空
    • 2.7销毁栈
    • 2.8 调试代码


前言


1.栈是什么?

在这里插入图片描述

栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。

栈顶(Top):线性表允许进行插入删除的那一端。

栈底(Bottom):固定的,不允许进行插入和删除的另一端。

空栈:不含任何元素的空表。

栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构

2.栈的接口实现

栈与顺序表类似,可设计为定长的静态栈或支持动态增长的栈。然而,定长栈存在较大局限性,在实际中不太实用,因此我们主要实现支持动态增长的栈。

与之前的顺序表/链表接口实现相同,我们首先创建一个头文件“Stack.h”以及两个源文件“Stack.c”和“Test.c”,它们的具体作用如下:

  • “Stack.h”:用于栈的定义、头文件的引用以及接口函数的声明。
  • “Stack.c”:实现接口函数。
  • “Test.c”:对各个函数进行测试。
    我们先完整展示“Stack.h”的代码,同时别忘了在两个源文件中引用“Stack.h”。
#pragma once //防止头文件被二次引用#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>typedef int STDataType; //如果要修改存储的数据类型可直接在此修改typedef struct Stack 
{STDataType* arr;int top;int capacity; //容量
}Stack;void StackInit(Stack* pst);//初始化栈void StackPush(Stack* pst, STDataType x);//入栈void StackPop(Stack* pst);//出栈STDataType StackTop(Stack* pst);//获取栈顶元素int StackSize(Stack* pst);//获取栈中有效元素个数bool StackEmpty(Stack* pst);//检测栈是否为空void StackDestory(Stack* pst);//销毁栈

2.1初始化栈

void StackInit(Stack* pst)
{assert(pst); //断言,防止传入空指针pst->arr = NULL; //初始化指针,置空pst->top = 0; //top指向栈顶数据的下一个位置pst->capacity = 0; //初始化容量
}

类似地,我们可将结构体中的 top 近似理解为数组的下标(虽然并非完全等同,但这样理解较为方便)。当我们在初始化栈时,将 top 初始化为 0,此时栈中无数据,top 指向栈顶数据的下一个位置。在这里插入图片描述
当我们将 top 初始化为 -1 时,top 会指向栈顶数据的位置。
本文我们采用的是 top 初始值为 1 的情况。

2.2入栈

void StackPush(Stack* pst, STDataType x)
{if (pst->top == pst->capacity) //容量已满,需要扩容{int NewCapacity = pst->capacity == 0 ? 4 : pst->capacity * 2; //如果容量为0则扩到4,否则扩为2倍STDataType* cmp = (STDataType*)realloc(pst->arr, NewCapacity * sizeof(STDataType));//创建一个临时指针变量来存储新空间地址,防止开辟失败if (cmp == NULL) //防止空间开辟失败出现空指针{perror("realloc fail");return;}pst->arr = cmp; //将临时指针变量中存放的新空间地址赋值给arrpst->capacity = NewCapacity; //空间容量更新}pst->arr[pst->top] = x; //将数据存放进栈顶元素的下一个位置pst->top++; //位置更新
}

2.3 出栈

void StackPop(Stack* pst)
{assert(pst); //断言,防止传入空指针assert(!StackEmpty(pst)); //断言,用检测空栈的函数返回值来判断,栈为空则不能出栈pst->top--; //位置更新
}

出栈只需要移动top的位置,把原来栈顶的元素“踢出”有效数据范围即可。StackEmpty函数将在后面讲到。

2.4 获取栈顶元素

STDataType StackTop(Stack* pst)
{assert(pst); //断言,防止传入空指针assert(!StackEmpty(pst)); //断言,用检测空栈的函数返回值来判断,栈为空则不能获取return pst->arr[pst->top - 1]; //top-1为栈顶元素位置,返回其值即可
}

2.5 获取栈中有效元素个数

int StackSize(Stack* pst)
{assert(pst); //断言,防止传入空指针return pst->top; //top即为有效元素个数
}

2.6 检测栈是否为空

bool StackEmpty(Stack* pst)
{assert(pst); //断言,防止传入空指针return pst->top == 0; //如果top为0表达式则为真,返回值为ture,反之为false
}

2.7销毁栈


bool StackEmpty(Stack* pst)
{assert(pst); //断言,防止传入空指针return pst->top == 0; //如果top为0表达式则为真,返回值为ture,反之为false
}

2.8 调试代码

所有接口都完成后,我们在Test.c中调试一下

#include "Stack.h"
void TestStack()
{ST st;StackInit(&st);StackPush(&st, 1);StackPush(&st, 2);StackPush(&st, 3);printf("%d ", StackTop(&st));StackPop(&st);printf("%d ", StackTop(&st));StackPop(&st);StackPush(&st, 4);StackPush(&st, 5);while (!StackEmpty(&st)){printf("%d ", StackTop(&st));StackPop(&st);}printf("\n");StackDestory(&st);
}
int main()
{TestStack();return 0;
}

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

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

相关文章

C语言图书信息管理系统

题目&#xff1a;图书信息管理系统 内容及主要功能描述&#xff1a; 该系统用于管理图书信息&#xff0c;包括图书的增加、删除、查找、修改、浏览、按出版社统计图书数量等功能。具体功能包括&#xff1a; 增加图书&#xff1a;输入图书信息并添加到系统中。删除图书&#x…

【漏洞复现】phpStudy 小皮 Windows面板 存在RCE漏洞

靶场资料后台自行领取【靶场】 image-20240726092307252 PhpStudy小皮面板曝RCE漏洞&#xff0c;本质是存储型XSS引发。攻击者通过登录用户名输入XSS代码&#xff0c;结合后台计划任务功能&#xff0c;实现远程代码执行&#xff0c;严重威胁服务器安全。建议立即更新至安全版…

JAVA SE 类和对象

类和对象 类定义和使用类的定义格式 类的实例化什么是实例化 this 引用this引用的特性 对象的构造及初始化如何初始化对象构造方法概念特性 在这里插入图片描述 **注意**&#xff1a; 封装封装的概念封装扩展之包导入包中的类自定义包包的访问权限控制举例 static成员static修饰…

【计算机网络】TCP协议详解

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 1、引言2、udp和tcp协议的异同3、tcp服务器3.1、接口认识3.2、服务器设计 4、tcp客户端4.1、客户端设计4.2、说明 5、再研Tcp服务端5.1、多进程版5.2、多线程版 5、守护进程化5.1、什么是守护进程5.2…

古籍双层PDF制作教程:保姆级古籍数字化教程

在智慧古籍数字化项目中&#xff0c;很多图书馆要求将古籍导出为双层PDF&#xff0c;并且确保输出双层PDF底层文本与上层图片偏移量控制在1毫米以内。那么本教程带你使用古籍数字化平台&#xff0c;3分钟把一个古籍书籍转化为双侧PDF。 第1步&#xff1a;上传古籍 点批量上传…

云服务器Ubuntu18.04进行Nginx配置

云服务器镜像版本信息&#xff1a;Ubuntu 18.04 server 64bit&#xff0c;本文记录了在改版本镜像上安装Nginx&#xff0c;并介绍了Nginx配置文件目录&#xff0c;便于后面再次有需求时进行复习。 文章目录 Nginx的安装Nginx配置文件分析 Nginx的安装 1.执行下面命令进行安装…

玩转CSS:用ul li +JS 模拟select,避坑浏览器不兼容。

玩转CSS&#xff1a;用ul li JS 模拟select&#xff0c;避坑浏览器不兼容。 在前端的工作中&#xff0c;经常会遇到 selcet控件&#xff0c;但我们用css来写它的样式时候&#xff0c;总是不那么令人满意&#xff0c;各种浏览器不兼容啊有没有&#xff1f; 那么&#xff0c;我…

西电网络空间安全综合953考研分享||西安电子科技大学

一、院校选择 如何选择适合自己的学校以及专业 1. 首先要对自己选择的学校有热情&#xff0c;选择自己最想去的学校 2. 其次选择在自己能力范围内努力能考上的学校&#xff0c;综合考虑地区&#xff08;不同地区公共课分数有一定的差别&#xff09;、学校&#xff08;建议跨…

Vue3计算属性终极实战:可媲美Element Plus Tree组件研发之节点勾选

前面完成了JuanTree组件的节点编辑和保存功能后&#xff0c;我们把精力放到节点勾选功能实现上来。**注意&#xff0c;对于组件的开发者来说&#xff0c;要充分考虑用户的使用场景&#xff0c;组件提供的多个特性同时启用时必须要工作良好。**就拿Tree组件来说&#xff0c;用户…

如何保证前后端交互信息不被篡改。

先说说前后端有哪些认证方式来保证&#xff1a; 基于 session 的认证方式&#xff1a;前端在用户登录成功后&#xff0c;后端会在服务器端生成一个唯一的 session ID&#xff0c;并将该 session ID 返回给前端&#xff0c;在后续的请求中&#xff0c;前端需要带上该 session ID…

【CUDA Runtime】第一个“Hello World“程序

文章目录 前言前提须知CUDA Runtime 简介核心功能优势和应用 使用CudaRuntime进行第一个"Hello world"程序创建CudaRuntime工程选择GPU函数原型参数返回值作用 获取支持Cuda的GPU信息获取支持Cuda的GPU数量获取设备属性运行展示 在GPU上分配内存把需要运行的主机内存…

数据库密码实现加盐加密处理

在实际的开发中&#xff0c;我们的数据库密码一般都是明文的方式存储在数据库中&#xff0c;但是&#xff0c;这种操作非常不安全&#xff0c;容易被黑&#xff01; 那么&#xff0c;此时我们就需要对其进行加密处理&#xff0c;市面上比较常见的就是MD5加密了&#xff0c;但是…

【Linux】syscall sys_write流程摸索

这是通过tty进行摸索sys_write的流程。 在前面的博客里&#xff0c;我们可以看到基于内核C语言源代码日志打印&#xff0c;在打印的日志里边包含&#xff1a;日期&#xff0c;时间&#xff0c;当前文件所在代码目录&#xff0c;当前执行函数名&#xff0c;当前文件执行行号&am…

运维团队如何借助分布式部署提升监控效率与可靠性

随着企业IT基础设施的日益复杂和分布式架构的广泛应用&#xff0c;传统的监控解决方案已经难以满足现代运维团队的需求。在这样的背景下&#xff0c;分布式部署作为一种新型的监控架构&#xff0c;以其灵活性、可扩展性和高可用性&#xff0c;成为了运维团队提升监控效率与可靠…

C++模版基础知识与STL基本介绍

目录 一. 泛型编程 二. 函数模板 1. 概念 2. 函数模版格式 3. 函数模版的原理 4. 模版函数的实例化 (1). 隐式实例化 (2.) 显式实例化 5. 模版参数的匹配原则 三. 类模板 1. 类模板的定义格式 2. 类模板的实例化 四. STL的介绍 1. 什么是STL&#xff1f; 2. STL的版…

3.5-RNN文本生成

1语言模型生成文本的顺序 前面我们已经能够实现使用下图的LSTM网络进行语言建模&#xff1b; 对于一个已经在语料库上学习好的LSTM模型&#xff1b;如果语料库就只是you say goobye and i say hello&#xff1b;那么当把单词i输入到模型中&#xff0c;Time xxx层的第一个LSTM…

苍穹外卖01

0. 配置maven (仅一次的操作 1.项目导入idea 2. 保证nginx服务器运行 &#xff08;nginx.exe要在非中文的目录下&#xff09; 开启服务&#xff1a; start nginx 查看任务进程是否存在&#xff1a; tasklist /fi "imagename eq nginx.exe" 关闭ngi…

中文之美,美在辞藻富丽,也美在情感含蓄内敛。

文章目录 引言句句不提幸福,句句都是幸福句句不提释怀,句句都是释怀句句不提爱意,句句都是爱意句句不提安慰,句句都是安慰句句不提遗憾,句句都是遗憾句句不提思念,句句都是思念引言 许多句子没有将主题直抒胸臆,却通过字词间的呼应、碰撞,让人感受到“言未表而意无穷”…

java高级——Exception异常类基本解读

java高级——Exception异常类基本解读 前情提要文章介绍继承结构异常详解1. 异常的定义2. 异常的分类3.3 异常的处理机制3.3.1 try catch finally语句3.3.2 throw关键字3.3.3 throws关键字 4. 浅谈如何有效的避免异常的发生5. 自定义异常6. 常见的RuntimeException 总结 前情提…

JDBC(Java访问数据库)

Java Database Connectivity&#xff1a;Java访问数据库的解决方案 JDBC定义了一套标准接口&#xff0c;即访问数据库的通用API&#xff0c; 不同的数据库厂商根据各自数据库的特点去实现这些接口。 JDBC希望用相同的方式访问不同的数据库&#xff0c;让具体的数据库操作与数…