数据结构(栈)

文章目录


一、概念与结构

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

栈的实现⼀般可以使⽤数组或者链表实现,相对⽽⾔数组的结构实现更优⼀些。因为数组在尾上插⼊数据的代价⽐较⼩。 一般使用数组作为栈的底层结构对栈的出栈压栈更方便)

二、栈的实现

stack.h

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int STDataType;
typedef struct Stack{STDataType* arr;int top;int capacity;}ST;// 初始化栈void STInit(ST * ps);// 销毁栈void STDestroy(ST * ps);// ⼊栈void STPush(ST * ps, STDataType x);//出栈void STPop(ST * ps);//取栈顶元素STDataType STTop(ST * ps);//获取栈中有效元素个数int STSize(ST * ps);//栈是否为空
bool STEmpty(ST * ps);

stack.c

初始化栈
void STInit(ST* ps)
{assert(ps);ps->arr = NULL;ps->capacity = ps->top = 0;}
销毁栈
void STDestroy(ST* ps)
{assert(ps);if (ps->arr){free(ps->arr);}ps->arr = NULL;ps->capacity = ps->top = 0;
}
入栈
void STPush(ST* ps, STDataType x)
{assert(ps);if(ps->capacity==ps->top)    //空间满了{ int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;STDataType* tmp = (STDataType*)realloc(ps->arr, newcapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail");exit(1);}ps->arr = tmp;ps->capacity = newcapacity;}//空间足够,直接插入ps->arr[ps->top] = x;ps->top++;
}

出栈
bool STEmpty(ST* ps)     
{assert(ps);return ps->top == 0;    //若栈为空则返回 true
}void STPop(ST* ps)
{assert(ps);assert(!STEmpty);   //若栈不为空 ,则返回false,(!false)就为 true--ps->top;             //直接 --top}

取栈顶元素
STDataType STTop(ST* ps)
{assert(ps);assert(!StackEmpty(ps));return ps->arr[ps->top - 1]; //直接返回栈顶位置,数组是由下标表示,这里记得 top-1
}
 
获取栈中有效元素个数
int STSize(ST* ps)
{assert(ps);return ps->top;
}

test.c

#include"stack.h"void STTest()
{ST st;STInit(&st);//STPush(&st, 1);STPush(&st, 2);STPush(&st, 3);STPush(&st, 4);//循环打印出栈数据while (!STEmpty(&st)){STDataType data = STTop(&st);printf("%d", data);STPop(&st);}printf("\n栈中的有效个数:%d\n", STSize(&st));STDestroy(&st);
}int main() {STTest();return 0;
}

 

  • 往栈顶插入数据:

 

  •  //循环打印出栈数据,直到栈为空

 

 三、有效括号(算法题)20. 有效的括号 - 力扣(LeetCode)

  • 下面利用栈的特点来解决一道算法题 

先利用上述栈的实现函数定义一个结构体,并且初始化。

bool isValid(char* s) {ST st;STInit(&st);// 遍历字符串 schar* ps = s;while (*ps != '\0') {// 左括号,入栈if (*ps == '(' || *ps == '[' || *ps == '{') {STPush(&st, *ps);}// 右括号,和栈顶元素比较是否能匹配else {// 栈为空,直接返回false,意思就是 *ps == 右括号 这种情况if (STEmpty(&st)) {return false;}// 当存在左括号,即入栈了,栈不为空才能取栈顶元素// 取栈顶元素char a = STTop(&st);if ((*ps == ')' && a == '(') || (*ps == ']' && a == '[') || (*ps == '}' && a == '{')) {// 出栈STPop(&st);}// 当只存在左括号:else {STDestroy(&st);return false;}}ps++;}// 当ps和a中的符号都能匹配完成,元素全部出栈,栈为空,返回truebool ret = STEmpty(&st);STDestroy(&st);return ret;
}

思路:

  • 用字符指针 *ps 遍历字符串
  • 若 ps 遍历到的字符为左括号 ,入栈
  • 若 ps 遍历到的字符为右括号,1)取栈顶元素,与 ps 进行比较 

                                                        2)栈顶元素匹配 *ps,出栈,ps++ ,直至所有元素匹配,全部元素出栈,栈为空,返回false

                                                        3)栈顶元素不匹配 *ps,直接返回false 

未完待续~~

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

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

相关文章

docker compose 容器 编排分组

遇到问题&#xff1a;执行docker compose up -d 后docker compose 创建的容器们 在desktop-docker 中都在docker下一堆 搜索想着能不能把这个docker名字改一下&#xff0c;但是都没有找到这样的一个方案&#xff1b; 最后发现&#xff0c;我执行docker compose up -d 命令所在…

7. LangChain4j如何使用统一api调用?

前言 当我们对接LangChain4j的时候&#xff0c;面对复杂的各种各样的大模型的api的对接&#xff0c;让很多开发者感到力不从心。在每个大模型的api都不一样的时候&#xff1f;该如何快捷的切换模型的使用呢&#xff1f; 这时&#xff0c;One-API应运而生&#xff0c;它以其简洁…

面向初学者和专家的 40 大机器学习问答(2024 年更新)

面向初学者和专家的 40 大机器学习问答(2024 年更新) 一、介绍 机器学习是人工智能的重要组成部分,目前是数据科学中最受欢迎的技能之一。如果你是一名数据科学家,你需要擅长 python、SQL 和机器学习——没有两种方法。作为 DataFest 2017 的一部分,我们组织了各种技能测…

windows ssh的登录,私钥权限太开放 WARNING: UNPROTECTED PRIVATE KEY FILE!

问题描述 ssh -i wang -D localhost:1080 wangsg.ks99.topBad permissions. Try removing permissions for user Permissions for xxx are too open. F:\pms\pms-gpg-key\ssh-key\wang>ssh -i wang -D localhost:1080 wangsg.ks99.top Bad permissions. Try removing perm…

flutter 充电气泡

前言&#xff1a; 之前一直看到 有手机充电的时候 有气泡从Type-C 的位置冒泡上来 慢慢上移&#xff0c; 然后和上面的圆圈 会和&#xff0c;感觉还是挺好看的。今天试了下用 Flutter 实现了一版本。大致效果如下&#xff0c;而且气泡 和 气泡直接还可以粘黏 实现原理&#xff…

【开发实战】QT5 + OpenCV4 开发环境配置应用演示

前言 作为深度学习算法工程师&#xff0c;必须要掌握应用开发技能吗&#xff1f;搞工程肯定是必须要会界面开发&#xff0c;QT就是一个很不错的选择。本文以QT5.15 OpenCV4.8 OpenVINO2023为例&#xff0c;搭建应用开发环境&#xff0c;演示深度学习模型的QT应用案例。 开发…

newton算法实现的div的verilog

代码如下 module cordicDiv (input CLOCK,RESET,input iCall, input [31:0]dividend,input [31:0]divisor,output [31:0]quotient );reg signed [7:0]e;reg signed [31:0]f,rp,dd,x0,x1;reg signed [63:0]q;reg [7:0]i;reg isDone,isSign,isE;always ( posedge CLOCK or nege…

windows USB 设备驱动开发-开发Type C接口的驱动程序(三)

编写 USB Type C 端口控制器驱动程序 如果 USB Type-C 硬件实现 USB Type-C 或电源传送 (PD) 物理层&#xff0c;但未实现供电所需的状态机&#xff0c;则需要编写 USB Type-C 端口控制器驱动程序。 在 Windows 10 版本 1703 中&#xff0c;USB Type-C 体系结构已得到改进&am…

RKE部署k8s

移除docker&#xff08;非必要&#xff09; rm -rf /etc/docker rm -rf /run/docker rm -rf /var/lib/dockershim rm -rf /var/lib/docker yum list installed | grep docker yum remove ***rke部署k8s集群 cat > /etc/sysctl.conf << EFO net.ipv4.ip_forward 1 n…

【VUE学习】day03-过滤器filter

VUE学习第三天 过滤器filter全局过滤器私有过滤器 过滤器filter 作用&#xff1a;常见的文本格式化使用场景&#xff1a;插值表达式、v-bind用法&#xff1a;{{msg | filterName}} ; v-bind:属性‘msg | filterName’ msg:需要格式化的文本信息&#xff08;管道符前面的数据&a…

pytorch学习(十)优化函数

优化函数主要有&#xff0c;SGD, Adam&#xff0c;RMSProp这三种&#xff0c;并且有lr学习率&#xff0c;momentum动量&#xff0c;betas等参数需要设置。 通过这篇文章&#xff0c;可以学到pytorch中的优化函数的使用。 1.代码 代码参考《python深度学习-基于pytorch》&…

postman使用说明

Postman是一款非常流行的API开发、测试和文档生成工具&#xff0c;它可以帮助开发人员轻松地创建和管理API请求&#xff0c;并提供了强大的功能来模拟和测试API响应。在本文中&#xff0c;我将介绍如何使用Postman来创建和管理API请求&#xff0c;以及如何使用它的高级功能来测…

Java里的引用详解

1.体验方法引用 方法引用的出现原因 在使用Lambda表达式的时候&#xff0c;我们实际上传递进去的代码就是一种解决方案&#xff1a;拿参数做操作 那么考虑一种情况&#xff1a;如果我们在Lambda中所指定的操作方案&#xff0c;已经有地方存在相同方案&#xff0c;那是否还有必要…

2024最新教程,在docker中安装kali,并配置ssh连接

docker的基本使用&#xff1a;搭建高效攻防靶场vulfocus与Docker仓库管理实战&#xff1a;从听说到入门 拉取kali官方镜像 docker pull kalilinux/kali-rolling 启动一个kali镜像&#xff0c;将容器中的22端口映射到主机100端口&#xff0c;方便ssh直接连接 docker run -it…

白骑士的PyCharm教学基础篇 1.3 调试与运行

系列目录 上一篇&#xff1a; 配置与调试环境 配置调试环境 选择解释器 在 PyCharm 中选择正确的 Python 解释器&#xff1a;依次点击 “File” -> “Settings” -> “Project: [项目名]” -> “Project Interpreter”&#xff0c;选择或添加解释器。 配置运行/…

Model Import Settings

前言 在可视化3D世界中&#xff0c;模型是3D世界的核心&#xff0c;你可以没有贴图&#xff0c;可以没有特效&#xff0c;甚至可以没有用户交互界面&#xff0c;但必须得有模型来描述世界的基本样貌。 在3D世界中&#xff0c;由点线面构成了模型的轮廓&#xff1b;由UV和纹理&a…

Java 集合框架:Java 中的优先级队列 PriorityQueue 的实现

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 018 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

在JavaScript 中,== 和 === 的区别

在 JavaScript 中&#xff0c; 和 是用来比较两个值是否相等的运算符&#xff0c;它们之间有一些重要的区别&#xff1a; 运算符&#xff08;相等运算符&#xff09;&#xff1a; 运算符会在比较之前进行类型转换。如果两个操作数类型不同&#xff0c; 会尝试将它们转换为相…

用不同的url头利用Python访问一个网站,把返回的东西保存为txt文件

这个需要调用requests模块&#xff08;相当于c的头文件&#xff09; import requests 还需要一个User-Agent头&#xff08;这个意思就是告诉python用的什么系统和浏览器&#xff09; Google Chrome&#xff08;Windows&#xff09;: Mozilla/5.0 (Windows NT 10.0; Win64; x64…

【Git命令】git rebase之合并提交记录

使用场景 在本地提交了两个commit&#xff0c;但是发现根本没有没必要分为两次&#xff0c;需要想办法把两次提交合并成一个提交&#xff1b;这个时候可以使用如下命令启动交互式变基会话&#xff1a; git rebase -i HEAD~N这里 N 是你想要重新调整的最近的提交数。 如下在本地…