栈的基本操作

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary-walk

      ⸝⋆   ━━━┓
     - 个性标签 - :来于“云”的“羽球人”。 Talk is cheap. Show me the code
┗━━━━━━━  ➴ ⷯ

本人座右铭 :   欲达高峰,必忍其痛;欲戴王冠,必承其重。

👑💎💎👑💎💎👑 
💎💎💎自💎💎💎
💎💎💎信💎💎💎
👑💎💎 💎💎👑    希望在看完我的此篇博客后可以对你有帮助哟

👑👑💎💎💎👑👑   此外,希望各位大佬们在看完后,可以支持一下。
👑👑👑💎👑👑👑


目录:
一:初始化
二:销毁
三:进栈(入栈 / 压栈)
四:出栈
五:获取栈顶元素
六:求栈中元素个数
七:判空
八:练习

栈的基本了解: 栈的概念和结构:

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。
栈中的数据元素遵守后进先出LIFOLast In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶
出栈:栈的删除操作叫做出栈。出数据也在栈顶
1:初始化

在对栈进行初始化之前需要先对栈这个结构进行定义一下

这里暂且就以 数组栈为例

typedef int STDataType;
typedef struct Stack {STDataType* a;//动态的int capacity;//容量int top;//记录栈顶位置
}ST;

初始化:让 capacity = 0,至于 top 是为0 还是为 1,自行决定 

void STInit(ST* pst)
{assert(pst);pst->a = NULL;pst->capacity = 0;pst->top = 0;//表示 top  指向栈顶元素下一个位置//pst->top = -1;//表示 top  指向栈顶元素的位置
}
2:销毁

这个就很简单了,直接对 数组进行销毁即可

3:进栈(入栈 / 压栈)

注意: 初始化 top 的值  对进栈的操作很重要

top = 0 :top 指向栈顶元素下一个的位置

top =  0 ,此时进栈需要 先把数据插到 top  对应的位置,之后top++ 

top = 0 :刚好也可以表示 栈中数据元素个数为 0

top = -1 :top 指向 栈顶元素位置

top = -1:

进栈的操作:先让top++;再对top 所在地位置进行插入数据 

 

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, sizeof(STDataType) * newcapacity);if (tmp == NULL)return;//成功pst->a = tmp;pst->capacity = newcapacity;}pst->a[pst->top] = x;pst->top++;//指向栈顶元素下一个位置
}
4:出栈

直接一步到位即可;让top - - 

注意不是 top -1

void STPop(ST* pst)
{assert(pst);assert(!STEmpty(pst));//判空pst->top--;
}
5:获取栈顶元素
STDataType STTop(ST* pst)//获取栈顶元素
{assert(pst);return pst->a[pst->top-1];// 注意top 永远指向栈顶元素下一个位置
}
6:求栈中元素个数
int STSize(ST* pst)//求栈中元素个数
{assert(pst);return pst->top;
}
7:判空 
bool STEmpty(ST* pst)
{assert(pst);/*if (pst->top == 0){return true;}elsereturn false;*/return pst->top == 0;//不用三目操作符
}
完整代码:
 test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"stack.h"void test()
{ST st;STInit(&st);STPush(&st, 1);//STPrint(&st);//注意没有这种写法//对于栈的访问都是边访问边出栈STPush(&st, 2);STPush(&st, 3);STPush(&st, 4);STPush(&st, 5);STPush(&st, 6);int size = STSize(&st);while (!STEmpty(&st)){printf("%d ", STTop(&st));//获取栈顶元素STPop(&st);//出栈}STDestroy(&st);}
int main()
{test();return  0;
}
Stack.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"void STInit(ST* pst)
{assert(pst);pst->a = NULL;pst->capacity = 0;pst->top = 0;//表示 top  指向栈顶元素下一个位置//pst->top = -1;//表示 top  指向栈顶元素的位置
}
void STDestroy(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;
}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, sizeof(STDataType) * newcapacity);if (tmp == NULL)return;//成功pst->a = tmp;pst->capacity = newcapacity;}pst->a[pst->top] = x;pst->top++;//指向栈顶元素下一个位置
}
void STPop(ST* pst)
{assert(pst);assert(!STEmpty(pst));//判空pst->top--;
}STDataType STTop(ST* pst)//获取栈顶元素
{assert(pst);return pst->a[pst->top-1];// 注意top 永远指向栈顶元素下一个位置
}int STSize(ST* pst)//求栈中元素个数
{assert(pst);return pst->top;
}bool STEmpty(ST* pst)
{assert(pst);/*if (pst->top == 0){return true;}elsereturn false;*/return pst->top == 0;//不用三目操作符
}
Stack.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int STDataType;
typedef struct Stack {STDataType* a;//动态的int capacity;//容量int top;//记录栈顶位置
}ST;void STInit(ST* pst);
void STDestroy(ST* pst);void STPush(ST* pst, STDataType x);
void STPop(ST* pst);STDataType STTop(ST* pst);//获取栈顶元素int STSize(ST* pst);//求栈中元素个数bool STEmpty(ST* pst);

 8:练习

刚刚好学了栈,那咱就趁热打铁练习一下 

分析:

当是左括号中的 {   (     [   任一个,我们就进栈  ;若是出现对应的右括号中的任一个我们就去栈顶元素进行匹配 若是 左右括号不能匹配成功则  return  false;

结语:

以上就是我今日要share 的,总体来说很简单相较于链表那块,轻松拿捏,同时在今天这个特别 的日子里也是祝愿大家新春快乐,在新的一年里快快乐乐,在学习上工作上一帆风顺

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

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

相关文章

【Java面试】数据类型常见面试题

什么是包装类型 将基本类型包装进了对象中得到的类型 基本类型和包装类型有什么区别 用途不同&#xff1a;基本类型一般用于局部变量&#xff0c;包装类型用于其他地方存储方式不同&#xff1a;用于局部变量的基本类型存在虚拟机栈中的局部变量表中&#xff0c;用于成员变量…

物联网数据隐私保护技术

在物联网&#xff08;IoT&#xff09;的世界中&#xff0c;无数的设备通过互联网连接在一起&#xff0c;不断地收集、传输和处理数据。这些数据有助于提高生产效率、优化用户体验并创造新的服务模式。然而&#xff0c;随着数据量的剧增&#xff0c;数据隐私保护成为了一个不能忽…

力扣刷题之旅:进阶篇(三)

力扣&#xff08;LeetCode&#xff09;是一个在线编程平台&#xff0c;主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目&#xff0c;以及它们的解题代码。 --点击进入刷题地址 一、动态规划&#xff08;DP&#xff09; 首先&#xff0c;让我们来…

《PCI Express体系结构导读》随记 —— 第II篇 第4章 PCIe总线概述(10)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第II篇 第4章 PCIe总线概述&#xff08;9&#xff09; 4.2 PCIe体系结构的组成部件 PCIe总线作为处理器系统的局部总线&#xff0c;其作用与PCI总线类似&#xff0c;主要目的是为了连接处理器系统中的外部设备&…

【机器学习】基于集成学习的 Amazon 用户评论质量预测

实验六: 基于集成学习的 Amazon 用户评论质量预测 1 案例简介 ​ 随着电商平台的兴起&#xff0c;以及疫情的持续影响&#xff0c;线上购物在我们的日常生活中扮演着越来越重要的角色。在进行线上商品挑选时&#xff0c;评论往往是我们十分关注的一个方面。然而目前电商网站的…

Golang的for循环变量和goroutine的陷阱,1.22版本的更新

先来看一段golang 1.22版本之前的for循环的代码 package mainimport "fmt"func main() {done : make(chan bool)values : []string{"chen", "hai", "feng"}for _, v : range values {fmt.Println("start")go func() {fmt.P…

【05】C++ 内存管理

文章目录 &#x1f308; Ⅰ C 内存分布&#x1f308; Ⅱ C 内存管理方式1. new 和 delete 操作内置类型2. new 和 delete 操作自定义类型 &#x1f308; Ⅲ operator new 和 operator delete&#x1f308; Ⅳ new 和 delete 的实现原理1. 内置数据类型2. 自定义数据类型 &#…

过渡效果的艺术:CSS transition 让网页交互更平滑(下)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

使用人工智能将扫描地图中的数据数字化

Bunting Labs 推出了新版本QGIS AI 地图追踪插件&#xff0c;这是一款由人工智能驱动的自动数字化扫描地图和平面图特征的工具。Egan 和联合创始人 Brendan Ashworth 开发了这个插件&#xff0c;以快速加快从扫描地图和平面图中提取地理特征的过程。 通常&#xff0c;从 PDF 中…

飞天使-linux操作的一些技巧与知识点9-zabbix6.0 容器之纸飞机告警设置

文章目录 zabbix 告警纸飞机方式webhook 方式 zabbix 告警纸飞机方式 第一种方式参考 https://blog.csdn.net/yetugeng/article/details/99682432bash-4.4$ cat telegram.sh #!/bin/bashMSG$1TOKEN"61231432278:AAsdfsdfsdfsdHUxBwPSINc2kfOGhVik" CHAT_ID-41dsdde…

EMNLP 2023精选:Text-to-SQL任务的前沿进展(下篇)——Findings论文解读

导语 本文记录了今年的自然语言处理国际顶级会议EMNLP 2023中接收的所有与Text-to-SQL相关&#xff08;通过搜索标题关键词查找得到&#xff0c;可能不全&#xff09;的论文&#xff0c;共计12篇&#xff0c;包含5篇正会论文和7篇Findings论文&#xff0c;以下是对这些论文的略…

Leetcode2786. 访问数组中的位置使分数最大

Every day a Leetcode 题目来源&#xff1a;2786. 访问数组中的位置使分数最大 解法1&#xff1a;动态规划 状态数组&#xff1a; dp[i][0]: 访问下标范围 [0, i] 中的元素且最后访问的元素是偶数时的最大得分&#xff1b;dp[i][1]: 访问下标范围 [0, i] 中的元素且最后访问…

html5+css3胶囊按钮代码

效果 代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title></title> <style> /* 胶囊开关的样式 */ .switch { position: relative; display: inline-block; width: 6…

EasyExcel操作Excel表格

一、EasyExcel介绍 1.1 介绍 EasyExcel 是一个基于 Java 的简单易用的 Excel 文件读写工具&#xff0c;它提供了一种简单而又高效的方式来读取、写入和操作 Excel 文件。EasyExcel 是阿里巴巴开源的项目&#xff0c;它旨在简化开发人员处理 Excel 文件的流程&#xff0c;使得…

API网关架构设计与实现的经验总结与实践

API网关是现代微服务架构中的重要组件&#xff0c;它充当了前端和后端微服务之间的中介。本文将介绍API网关的架构设计原则和实现方法&#xff0c;以帮助开发人员更好地理解和应用这些技术。 1. 什么是API网关&#xff1f; - 解释了API网关的基本概念和作用&#xff0c;以及…

【Spring框架】Spring事务的原理

目录 〇、对类或方法的Spring事务属性进行解析 0.1 解析标签 0.2 注册 InfrastructureAdvisorAutoProxyCreator 0.3 判断目标方法是否适合 canApply 0.4 匹配标签 match 0.5 小结 一、Spring事务的实现 1.1 准备事务 1.1.1 收集Transactional注解属性信息&#xff0c;…

美创科技与河南金融信创生态实验室签署战略合作协议

2024年1月31日&#xff0c;由普惠通科技与河南省科学院物理所、北京交通大学、中国金融电子化集团重庆金融认证中心联合发起成立中部地区第一家金融信创生态实验室运营公司&#xff08;即河南豫科普惠通信创科技有限公司&#xff09;与杭州美创科技股份有限公司战略合作签约仪式…

探索Xposed框架:个性定制你的Android体验

探索Xposed框架&#xff1a;个性定制你的Android体验 1. 引言 在当今移动设备市场中&#xff0c;Android系统作为最受欢迎的操作系统之一&#xff0c;其开放性和可定制性备受用户青睐。用户希望能够根据个人喜好和需求对其设备进行定制&#xff0c;以获得更符合自己习惯的使用…

深度学习自然语言处理(NLP)模型BERT:从理论到Pytorch实战

文章目录 深度学习自然语言处理&#xff08;NLP&#xff09;模型BERT&#xff1a;从理论到Pytorch实战一、引言传统NLP技术概览规则和模式匹配基于统计的方法词嵌入和分布式表示循环神经网络&#xff08;RNN&#xff09;与长短时记忆网络&#xff08;LSTM&#xff09;Transform…

谷歌 DeepMind 联合斯坦福推出了主从式遥操作双臂机器人系统增强版ALOHA 2

谷歌 DeepMind 联合斯坦福推出了 ALOHA 的增强版本 ——ALOHA 2。与一代相比&#xff0c;ALOHA 2 具有更强的性能、人体工程学设计和稳健性&#xff0c;且成本还不到 20 万元人民币。并且&#xff0c;为了加速大规模双手操作的研究&#xff0c;ALOHA 2 相关的所有硬件设计全部开…