栈知识梳理和函数实现

Python基础知识点梳理 python常见知识点梳理 摘要: 本文主要介绍一些平时经常会用到的python基础知识点,用于加深印象。python的详细语法介绍可以查看官方编程手册,也有一些在线网站对python语法进行了比较全面的介绍,比如菜鸟教程: python3 教程|菜鸟教程 本文主要是介绍基础语法,操作实例在另一篇博客中单独介绍: python语言介绍 python是一门解释型语言,python的设计目标: 一门... 阅读详情

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


前言


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; //将临时指针变量中存放的新空间地址赋值给arr
		pst->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;
}
PostgreSQL:十五. 性能优化 十五. 性能优化 优化简介: PostgreSQL优化一方面是找出系统的瓶颈,提高PostgreSQL数据库整体的性能; 另一方面,需要合理的结构设计和参数调整,以提高用户操作响应的速度; 同时还要尽可能的节省系统资源,以便系统可以提供更大负荷的服务。 PostgreSQL数据库优化是多方面的,原则是减少系统的瓶颈,减少资源的占用,增加系统的反应速度。例如: 通过优化文件系统,提高磁盘IO的读写速度; 通过优化操作系统调度策略,提高PostgreSQL的在高负荷情况下负载能力; 优化表结构、索引、查询 阅读详情

相关推荐

DOSBOX 0.74模拟器安装Windows 95

DosBox本身带有5.0版的DOS系统,启动后虚拟一个Z盘存放有Dosbox特有的外部指令,如config.com、imgmount.com等,经测试,可以顺利安装各版本的windows 3.1系统,但是不能安装win95,需要用原版的dos镜像启动才能安装。1. 获取启动盘镜像文件 下载Win95启动软盘镜像文件,名为boot.img,放到DosBox 0.74的目录下。2. 制作硬盘镜像文件

xjnzhidao的博客 9310

c++中栈stack的几个常用函数

栈是一种只能后入先出的容器,因此只有通过top来访问栈顶元素 1、top() 代码示例: #include <iostream> #include <string> #include<algorithm> #include<bits/stdc++.h> #include<stack> #include<set> #include <vector> #include <map> #include<queue&

weixin_45962741的博客 1万+

WPS中VBA支持库安装全攻略:从报错到一键解决

VBA作为Office生态中广泛使用的宏语言,是办公自动化的重要基础。WPS表格虽然兼容Excel文件格式,但出于技术路线与授权原因,默认并未集成完整的VBA引擎与开发环境,导致用户打开含宏文件时频繁遇到“找不到工程或库”“未找到VBA支持库”等报错。理解VBA支持库包含引擎与IDE两层结构,并掌握系统位数、版本匹配、安全软件拦截等前置条件,是成功部署的关键。通过可靠的安装源与规范流程完成配置后,即可实现在WPS中运行Excel宏、批量处理数据、自定义函数等自动化场景,显著提升报表处理效率。本文围绕WPS中

weixin_31102231的博客 311

【浅谈数据结构】栈的基本函数与操作

文章目录栈1.栈的定义2.栈的实现方式2.1线性栈 vs 链表栈 的优缺点2. 顺序栈栈(线性栈)2.1子函数含义 以及 实现1. 线性栈的结构类型2. InitStack3. StackEmpty4. StackFull5. Push6. StackPop7. StackTop8. StackDestroy2、顺序栈的基本操作 栈 栈是一种特殊的线性表,它们的逻辑结构和线性表相同,但是运算规则相比线性表有更多的限制,故又称它们为 运算受限 的线性表。 1.栈的定义 栈(Stack)是只能在一段(栈

GuLeng______的博客 3325

Ubuntu 22.04 搭建 PX4 飞控系统完全指南:从仿真到硬件试飞

定义消息文件protobufuint64 timestamp # 时间戳float32 temperature # 温度float32 humidity # 湿度生成代码:bashPX4 在 Ubuntu 22.04 的搭建涉及环境配置、编译仿真、硬件连接等多环节,核心是理解 PX4 1.14 的新特性(uXRCE-DDS、动态控制分配)。通过本文指南,开发者可快速构建稳定的 PX4 开发环境,为无人机应用开发奠定基础。

zqmgx13291的博客 3042

信息安全-入侵检测技术原理与应用

入侵检测技术原理与应用、入侵检测概述、入侵检测技术、入侵检测系统组成与分类、入侵检测系统主要产品与技术指标、入侵检测系统应用

我的个人博客 1万+

栈的各个功能函数的实现

栈的各个功能函数的实现

2302_76314368的博客 1857

Keil MDK 5.37及之后版本 安装AC5(ARMCC)编译器详细步骤

由于Keil 5.37及之后版本不再默认安装AC5(ARMCC)编译器,这就会导致由AC5编译的工程无法正常编译,往往输出窗口会提示以下信息:*** Target ‘STM32xxxx‘ uses ARM-Compiler ‘Default Compiler Version 5‘ which is not available.

s_Modesto的博客 1万+

【数据结构和算法】了解认识栈,并实现栈的相关函数

栈是限定在一个表里面的一段,对其进行插入删除操作的线性表,数据进出的顺序为先进后处,应用场景:网页浏览的时候的后退 编辑软件的撤销,实际上栈的功能就这样,学会顺序表以及链表的使用,对于栈来讲,只是懂得头擦头删,理解概念了,就好掌握并实现栈。

小王学代码 1711

【Bug已解决】zsh: command not found: claude 解决方案

方案适用场景推荐指数难度方案一:配置 npm 全局目录所有平台,长期使用⭐⭐⭐⭐⭐低方案二:修复 PATH 变量快速修复,不想改 npm 配置⭐⭐⭐⭐低方案三:重建软链接文件存在但链接断裂⭐⭐⭐中方案四:nvm 专属方案使用 nvm 管理多版本 Node.js⭐⭐⭐⭐低方案五:Windows 专属Windows 系统⭐⭐⭐⭐⭐低方案六:Homebrew 安装macOS 用户,npm 有问题⭐⭐⭐低根本原因。

博客 1万+

剪映自动化工具来了:AI帮你自动剪辑成片

🎬分享一个剪映自动化剪辑工具!AI 自动帮你完成从写文案、配音、加字幕、选音乐、上特效到最终导出的整套流程🎈

XiaoqiangClub的博客 858

数据结构初级<栈>

前面我们介绍了线性表的两种数据结构顺序结构和链式结构,这两种结构各有优劣,但是今天我们还有另一种数据结构,他是基于线性表衍生出来的特殊线性表,那就是“栈”,关于栈大家可能比较陌生,我们计算机程序在内存上运行时就会有许多栈帧,学完了这一节,大家对栈就会有一定的了解。​学完了栈的基础知识,我们可以发现,栈这种数据结构在实现其简单功能非常简单,但是栈的作用一般是辅助其他数据结构实现更复杂的功能的角色,所以掌握栈的基础操作也非常重要!

ARMCSKGT的博客 2837

(王道408考研数据结构)第八章排序-第一节:排序综述

文章目录一:排序一览二:简单插入排序(1)基本思想 一:排序一览 排序方法 类别 本文 时间复杂度 是否稳定 直接插入排序 插入排序 跳转 O(n2)O\left ( n^{2}\right )O(n2) 是 二叉树深度 简单 跳转 LeetCode 递归 翻转二叉树 简单 跳转 LeetCode 递归 相同的树 简单 跳转 LeetCode 递归 是否为子树 简单 跳转 LeetCode 递归 对称二叉树 简单 跳转 LeetCode 递归 平衡二叉树 简单 跳转

快乐江湖的博客 5489

理解计算机系统_程序的机器级表示(三):算数和逻辑操作,leaq指令,栈帧分析

以<深入理解计算机系统>(以下称“本书”)内容为基础,对程序的整个过程进行梳理。本书内容对整个计算机系统做了系统性导引,每部分内容都是单独的一门课.学习深度根据自己需要来定。

jllws1的博客 1042

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【C语言底层】函数栈帧的创建和销毁

函数栈帧的创建和销毁的理解

s_little_monster的博客 9万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

数据结构(C语言版) 第 三 章 栈与队列 知识梳理 + 作业习题详解

目录一、栈0.栈的基本概念二、队列0.队列的基本概念三、考研试题五、作业习题 本系列博客为《数据结构》(C语言版)的学习笔记(上课笔记),仅用于学习交流和自我复习 数据结构合集链接: 《数据结构》C语言版(严蔚敏版) 全书知识梳理(超详细清晰易懂) 一、栈 栈(stack)(last infirst out)(stack)(last \ in first\ out)(st...

繁凡さん的博客 3万+

栈和队列知识点梳理

栈和队列: 都属于特殊的线性结构 栈:特殊的线性表,只有一个出入口,只能在其一端进行数据的插入和删除         特性:后进先出    出入数据都在栈顶 可以看作只能进行尾插尾删的线性表   底层选择链式空间还是连续空间? 顺序表只要不在头部和中间进行增删,就不需要进行数据的搬移,那么效率就非常高,并且顺序结构的实现相对简单 ,只需要在尾部操作,时间为O(1),当然链式结构也是...

qq_41673560的博客 1708

复变函数思维导图梳理

本文将复变函数进行梳理,便于复习与初学者进行知识点梳理

m0_53163870的博客 9129

函数栈帧详解

函数栈帧万字详解,学不会你来捶我!!!在学习函数的时候我们或许会有一些疑惑,比如1、局部变量是怎末创建的?2、为什么局部变量的值是随机值?3、函数是怎末传参的,传参的顺序是怎么样的?4、形参和实参是什么关系?5、函数调用是怎末实现的?6、函数调用结束后是怎末返回返回值的?今天,博主就和大家一起探讨一起探讨一下函数栈帧的创建和销毁,学会了些,我们的疑惑也就自然解决了;回答一下前面的问题httpshttpshttpshttpshttpshttpshttps。......

南猿北者博客 2044

函数栈帧的创建和销毁

我们在写C语言程序时候,经常与函数打交道,把每个功能不同的模块写在不同的函数当中,函数中可能避免要写形参、局部变量、以及返回值。那么你有没有想过函数中创建的形参、局部变量、以及函数的返回值是在哪创建的呢?函数的参数又是怎样创建的呢?函数参数又是如何传递的呢?函数调用结束这些空间怎么处理呢?这些问题都与我们的函数栈帧的创建和销毁有关。函数栈帧(stack frame)就是函数调用过程中在程序的调用栈(call stack)所开辟的空间,这些空间是用来存放:(1)函数参数和函数返回值。

lzj317496的博客 867

栈和队列知识梳理

栈和队列: 都属于特殊的线性结构 栈:特殊的线性表,只有一个出入口,只能在其一端进行数据的插入和删除 特性:后进先出 出入数据都在栈顶 可以看作只能进行尾插尾删的线性表 底层选择链式空间还是连续空间? 顺序表只要不在头部和中间进行增删,就不需要进行数据的搬移,那么效率就非常高,并且顺序结构的实现相对简单 ,只需要在尾部操作,时间为O(1),当然链式结构也...

qq_43634879的博客 180

函数栈帧(栈区)

详解函数栈帧的创建与销毁。 局部变量是如何创建的?为什么局部变量是随机值?函数是如何传参的?传参的顺序如何?形参和实参的关系?函数调用是如何做到的?函数调用结束后如何返回?

m0_73790767的博客 1411

JS原理知识梳理

JS原理知识梳理从输入URL到页面展示,发生了什么1. DNS解析,根据域名获取服务器IP2. 建立TCP连接三次握手以建立TCP连接为什需要三次握手?3. 服务器处理请求并返回HTTP报文4. 浏览器显示 HTML5. 连接结束四次挥手为什么连接的时候是三次握手,关闭的时候却是四次握手?栈和堆js函数传参方式js深浅拷贝结语参考 从输入URL到页面展示,发生了什么 1. DNS解析,根据域名获取...

前端爆米花 1086

风险函数梳理工具

在日常的软件开发工作中,代码的安全性和质量至关重要。然而,面对庞大的代码库,手动查找潜在的风险函数不仅耗时,而且容易出错。特别是在团队协作中,代码审查和重构工作往往占据了大量宝贵的时间,使得开发者们无法专注于更具创造性的任务。那么,有没有办法让我们用更少的时间完成这些繁琐的工作,从而有更多时间去“摸鱼”呢?为此,我们开发了一款风险函数梳理工具,旨在帮助开发者快速定位并梳理代码中使用的不安全函数。

qq_44771627的博客 2116

Python函数知识点全面梳理

在Python中,函数通过def关键字定义,后跟函数名和圆括号(可能包含参数),然后是冒号,最后是函数体。调用函数时,只需使用函数名并传递必要的参数。print(result) # 输出: 8。

Luzem0319的博客 788

C语言知识点复习梳理

C语言知识点复习梳理 C语言的知识点讲完了,接下来就是做一下整理与总结,然后就会进入其他知识的学习。 本文目录如下: 基础知识。 顺序程序设计。 数据类型。 标准输入输出。 进制转换。 选择结构。 循环结构。 数组。 函数。 指针 结构体。 文件。 题外话 这里就是说一些我觉得很基础的问题,无关紧要,但是希望可以解决你的疑惑。 有什么好的C语言...

qq_37864510的博客 3273
上一篇: 关于数据存储位置的一点知识
下一篇: 关于顺序表数组下标的一些关系梳理
物语系列
博客等级 码龄6年 582粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值