线性表—栈的实现
目录
栈的概念及结构
栈的实现
创建栈
栈的初始化
入栈
出栈
取出栈顶数据
判断栈是否为空
有效数据个数
栈的销毁
全代码
stack.h
stack.c
应用
题目
示例
解题思路
代码实现
栈的概念及结构
栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。你也可以一边入一边出。
栈顶和栈底并不是固定的,这是人为决定的。
栈的实现
栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。
以下的内容如果你对顺序表的实现熟悉的话就很简单。
创建栈
栈的创建需要有指向动态数组指针,栈顶数据下标和容量。
typedef int STDataType;typedef struct Stack
{STDataType* arr;//指向动态数组指针int top;//栈顶数据下标int capacity;//容量
}ST;
栈的初始化
将arr置为空指针,top置为-1,capacity置为0。
//初始化
void STInit(ST* pst)
{assert(pst);pst->arr = NULL;pst->top = -1;pst->capacity = 0;
}
这里的top为什么要是-1呢?
一般来说top应该也是0,这里是-1是为了确保top是栈顶数据的下标。当然了你要是想写0也是可以的。
入栈
入栈又称压栈,进栈。
首先要判断容量是否够用,如果不够用的话就扩容。然后再把数据塞入即可。
//入栈
void STPush(ST* pst, STDataType x)
{assert(pst);if (pst->top + 1 == pst->capacity){pst->capacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDataType* p = (STDataType*)realloc(pst->arr, sizeof(STDataType) * pst->capacity);if (p == NULL){perror("realloc");return;}pst->arr = p;}pst->arr[++pst->top] = x;
}
注意:这里要前置++,如果后置就会造成非法访问。如果top是0,就要后置了。
出栈
这里要另外判断一下栈是否为空。然后只要让top--即可。
//出栈
void STPop(ST* pst)
{assert(pst);assert(pst->top > -1);pst->top--;
}
取出栈顶数据
这里也要判断一下栈是否为空。然后返回下标top对应的数据即可。
//取出出栈顶数据
STDataType STTop(ST* pst)
{assert(pst);assert(pst->top > -1);return pst->arr[pst->top];
}
判断栈是否为空
直接返回pst->top==-1即可。
//判断栈是否为空
bool STEmpty(ST* pst)
{assert(pst);return pst->top == -1;
}
该函数类型要是布尔类型。
如果top=-1则返回true,否则返回false。
有效数据个数
直接返回top+1即可。
//有效数据个数
int STSize(ST* pst)
{assert(pst);return pst->top + 1;
}
栈的销毁
用free销毁arr,并将它置为空指针。其它的置为初始化值即可。
//销毁
void STDestroy(ST* pst)
{assert(pst);free(pst->arr);pst->arr = NULL;pst->top = -1;pst->capacity = 0;
}
全代码
stack.h
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>typedef int STDataType;typedef struct Stack
{STDataType* arr;int top;int capacity;
}ST;//初始化
void STInit(ST* pst);//销毁
void STDestroy(ST* pst);//入栈
void STPush(ST* pst, STDataType x);//出栈
void STPop(ST* pst);//取出出栈顶数据
STDataType STTop(ST* pst);//判空
bool STEmpty(ST* pst);//获取数据个数
int STSize(ST* pst);
stack.c
#include "stack.h"//初始化
void STInit(ST* pst)
{assert(pst);pst->arr = NULL;pst->top = -1;pst->capacity = 0;
}//入栈
void STPush(ST* pst, STDataType x)
{assert(pst);if (pst->top + 1 == pst->capacity){pst->capacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDataType* p = (STDataType*)realloc(pst->arr, sizeof(STDataType) * pst->capacity);if (p == NULL){perror("realloc");return;}pst->arr = p;}pst->arr[++pst->top] = x;
}//出栈
void STPop(ST* pst)
{assert(pst);assert(pst->top > -1);pst->top--;
}//取出栈顶数据
STDataType STTop(ST* pst)
{assert(pst);assert(pst->top > -1);return pst->arr[pst->top];
}//判断栈是否为空
bool STEmpty(ST* pst)
{assert(pst);return pst->top == -1;
}//有效数据个数
int STSize(ST* pst)
{assert(pst);return pst->top + 1;
}//销毁
void STDestroy(ST* pst)
{assert(pst);free(pst->arr);pst->arr = NULL;pst->top = -1;pst->capacity = 0;
}
应用
题目
该题链接: https://leetcode.cn/problems/valid-parentheses/description/
示例
解题思路
这题根据栈的后进先出和边入边出的特性可以解决。
创建一个栈,只让左括号入栈,让右括号与栈里的数据匹配。如果匹配成功让左括号出栈,继续该操作直至字符串遍历完。如果匹配不成功则直接退出。
有几个要注意的点
- 字符串只有右括号
- 字符串只有左括号或只剩左或右括号
- arr是int的类型,要把它改成char类型
代码实现
bool isValid(char* s)
{ST st;STInit(&st);while(*s){if(*s == '(' || *s == '[' || *s == '{'){STPush(&st, *s);}else{if(st.top == -1)//字符串只有右括号{STDestroy(&st);return false;}STDataType top = STTop(&st);if(*s == ')' && top != '(' || *s == ']' && top != '[' || *s == '}' && top != '{'){STDestroy(&st);return false;}STPop(&st);}s++;}bool ret = STEmpty(&st);//字符串只有左括号或只剩左或右括号STDestroy(&st);return ret;
}
相关文章:

线性表—栈的实现
目录 栈的概念及结构 栈的实现 创建栈 栈的初始化 入栈 出栈 取出栈顶数据 判断栈是否为空 有效数据个数 栈的销毁 全代码 stack.h stack.c 应用 题目 示例 解题思路 代码实现 栈的概念及结构 栈是一种特殊的线性表,其只允许在固定的一端进行插入…...

react+antd --- 日期选择器,动态生成日期表格表头
先看一下效果---有当前月的日期 技术: 1: react 2:antd-UI库 -- table 3:moment--时间处理库 代码效果: import { Button, DatePicker, Table } from antd; import { useEffect, useState } from react; import momen…...

webgl入门-js与着色器间的数据传输
js与着色器间的数据传输 前言 课堂目标 使用js向着色器传递数据获取鼠标在canvas 中的webgl 坐标系位置 知识点 attribute 变量gl.vertextAttribute3f() 的同族函数鼠标在canvas 中的css 位置转webgl 坐标位uniform 变量gl.uniform4f() 的同族函数 第一章 用js控制一个点…...
springmvc异常处理
springmvc异常处理 spring中有三种方式可以优雅的处理异常 使用ExceptionHandler 使用HandlerExceptionResolver 使用ControllerAdviceExceptionHandler 使用ExceptionHandler 该方式只在指定的Controller有效,不会对其他的Controller产生影响 ControllerRequestMap…...
可拖动、连线的React画布组件有哪些? 官网分别是什么?
下面是一些常用的可拖动、连线的React画布组件以及它们的官方网站: react-dagre-d3:这是一个基于React和D3.js的可拖动、连线的图形编辑器组件。它使用DAG(有向无环图)布局算法,支持节点拖拽、连线、缩放等功能。官网&…...
专访 Staynex 创始人 Yuen Wong:酒店行业的变革者
整理:Tia,Techub News 传统酒店业其实已经很中心化了,几大巨头 OTA 平台几乎已经完成对行业的垄断,而酒店商家也不得不受制于平台的规则制度,向平台支付高比例的费用。Staynex 看到了其中的机会,并想利用区…...

最新版Ceph( Reef版本)块存储简单对接k8s(上集)
当前ceph 你的ceph集群上执行 1.创建名为k8s-rbd 的存储池 ceph osd pool create k8s-rbd 64 642.初始化 rbd pool init k8s-rbd3 创建k8s访问块设备的认证用户 ceph auth get-or-create client.kubernetes mon profile rbd osd profile rbd poolk8s-rbd部署 ceph-rbd-csi c…...

稳态大面积光伏组件IV测试太阳光模拟器
稳态大面积光伏组件IV测试太阳光模拟器是太阳能光伏组件质量检测和评价的重要步骤之一。本文将介绍光伏组件IV测试的原理及标准板选择。 I. 光伏组件IV测试原理 光伏组件IV测试即电流电压特性测试,是评估光伏组件性能的重要手段。其测量的主要参数为组件的电流和电…...
编写HTTP协议代理的一些知识(源码)
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 早期上网经常需要使用代理服务…...

LabVIEW天然气压缩因子软件设计
LabVIEW天然气压缩因子软件设计 项目背景 天然气作为一种重要的能源,其压缩因子的准确计算对于流量的计量和输送过程的优化具有关键意义。传统的计算方法不仅步骤繁琐,而且难以满足现场快速响应的需求。因此,开发一款既能保证计算精度又便于…...

GCP谷歌云有什么数据库类型,该怎么选择
GCP谷歌云提供的数据库类型主要包括: 关系型数据库:这类数据库适用于结构化数据,通常用于数据结构不经常发生变化的场合。在GCP中,关系型数据库选项包括Cloud SQL和Cloud Spanner。Cloud SQL提供托管的MySQL、PostgreSQL和SQL Se…...

项目经理之路:裁员与内卷下的生存策略
作为一名项目经理,身处这个充满挑战与机遇的行业中,今年所面临的裁员潮和内卷化趋势无疑给我的工作带来了前所未有的压力。然而,正是这些压力和挑战,让我们更加深刻地思考了在这个快速变化的时代中,我们项目经理应该如…...

MWM触摸屏工控机维修TEM-EV0 EN00-Z312yy-xx
触摸屏维修是一个比较复杂的过程,并且其中会涉及到各个部件的问题,这对于操作人员来说,关键在于是否可以找到问题所在。维修过程中建议先检查各接线接口是否出现松动,然后检查串口及中断号是否有冲突,若有冲突…...

idm下载到99.99%不动了 idm突然不下载了 idm下载到最后没速度咋办 IDM下载后没网了是怎么回事
idm能够帮助我们下载不同类型的网页视频,并且基于多线程下载技术的助力下使其下载速度比原来提升数倍以上,因此成为了许多朋友下载的小助手。但也有朋友反映idm下载网页视频超时连接不上,idm下载网页视频突然停止,究竟这些情况我们…...
设计模式-07 设计模式-观察者模式(Observer Pattern)
设计模式-07 设计模式-观察者模式(Observer Pattern) 1.定义 观察者模式是一种软件设计模式,它定义了一种一对多的依赖关系,其中一个对象(称为“主题”)维护了一个依赖对象的列表(称为“观察者”…...

戒烟网站|基于SSM+vue的戒烟网站系统的设计与实现(源码+数据库+文档)
戒烟网站 目录 基于SSM+vue的戒烟网站系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1网站功能模块 2管理员功能模块 3用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主…...

研发管理之认识DevOps
文章目录 一、什么是DevOps二、DevOps的背景和起源三、DevOps的特点和价值1、特点:2、价值: 四、DevOps如何帮助提高软件交付速度和质量 一、什么是DevOps DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称…...

Spring MVC(五) 文件上传
1 单文件上传 在程序开发中,有时候需要上传一些文件。我们在学习Servlet的时候,也做过文件上传的操作,只不过基于Servlet的文件上传操作起来过于复杂,因此所有的MVC框架都提供了自己的文件上传操作,基本上都是基于File…...
Redis——Redis数据分片的三种算法
Redis的数据分片通常是为了实现水平扩展,将数据分散到多个Redis节点上,以提高系统的容量和性能。在Redis的不同实现和集群方案中,数据分片的算法有所不同。以下是Redis数据分片的三种常见算法: 哈希取模分片(Hash Modu…...

【专利】一种日志快速分析方法、设备、存储介质
公开号CN116560938A申请号CN202310311478.5申请日2023.03.28 是我在超音速人工智能科技股份有限公司(833753) 职务作品,第一发明人是董事长夫妇,第二发明人是我。 ** 注意** : 内容比较多,还有流程图、界面等。请到 专利指定页面…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...

DAY 45 超大力王爱学Python
来自超大力王的友情提示:在用tensordoard的时候一定一定要用绝对位置,例如:tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾: tensorboard的发展历史和原理tens…...
2025.6.9总结(利与弊)
凡事都有两面性。在大厂上班也不例外。今天找开发定位问题,从一个接口人不断溯源到另一个 接口人。有时候,不知道是谁的责任填。将工作内容分的很细,每个人负责其中的一小块。我清楚的意识到,自己就是个可以随时替换的螺丝钉&…...