线性表—栈的实现
目录
栈的概念及结构
栈的实现
创建栈
栈的初始化
入栈
出栈
取出栈顶数据
判断栈是否为空
有效数据个数
栈的销毁
全代码
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) 职务作品,第一发明人是董事长夫妇,第二发明人是我。 ** 注意** : 内容比较多,还有流程图、界面等。请到 专利指定页面…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
