手撕数据结构之栈+例题

目录

一、栈的概念及结构

二、栈的头文件及基本框架

三、接口实现

1、对栈的初始化

 2、栈的销毁

3、入栈操作

4、出栈操作

 5、判断栈是否为空

6、返回栈顶元素

7、遍历栈

四、有效的括号 - 力扣(LeetCode)

题目描述:

 思路:

代码:


一、栈的概念及结构

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出的原则。

如同子弹夹,我们进行添子弹和出子弹,很形象。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

出栈:栈的删除操作叫做出栈。出数据也在栈顶。

 接下来,我们以数组栈的形式去模拟。

二、栈的头文件及基本框架

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>typedef int STDataType;typedef struct Stack
{STDataType* a;//就是以a开头的一段连续的空间int top;//定义栈顶位置int capacity;
}ST;void SLInit(ST* ps);
void SLDestroy(ST* ps);
void STPush(ST* ps, STDataType x);
void STPop(ST* ps);
int STSize(ST* ps);
bool STEmpty(ST* ps);
STDataType STTop(ST* ps);//获取栈顶元素

三、接口实现

1、对栈的初始化

void SLInit(ST* ps)
{ST* ret = (ST*)malloc(4 * sizeof(ST));if (ret == NULL){perror(malloc);exit(-1);}ps->a = ret;ps->capacity = 4;ps->top = 0;
}

 2、栈的销毁

void SLDestroy(ST* ps)
{free(ps->a);ps->a = NULL;ps->capacity = 0;ps->top = 0;
}

3、入栈操作

void STPush(ST* ps, STDataType x)
{assert(ps != NULL);//检查需不需要扩容if (ps->top == ps->capacity){ps->capacity += 4;ST* ret = (ST*)realloc( ps->a, sizeof(ST) * ps->capacity);if (ret == NULL){perror(realloc);exit(-1);}ps->a = ret;}ps->a[ps->top] = x;ps->top++;
}

4、出栈操作

void STPop(ST* ps)
{assert(ps);ps->top--;
}

 5、判断栈是否为空

bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;如果右边等式成立返回true,反之返回false
}

6、返回栈顶元素

STDataType STTop(ST* ps)
{assert(ps);assert(ps->top > 0);return ps->a[ps->top - 1];
}

7、遍历栈

不同于其他数据结构,遍历栈不用print

//遍历栈的特殊方式while (!STEmpty(&ps)){printf("%d ", STTop(&ps));STPop(&ps);}

四、有效的括号 - 力扣(LeetCode)

题目描述:

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

 思路:

如果是左括号就入栈,如果是右括号就与栈顶元素进行比较。这样就正好匹配题目的要求,但博主目前没有学过STL库,所以只能将上面的手撕栈CV一下啦,下面的代码为了避免冗余去除掉这一部分~

代码:

bool isValid(char * s)
{char* ret = s;int num = 0;//利用奇数偶数判断数量是否匹配while(*ret){num++;ret++;}if(num%2 != 0){return false;}ST ps;SLInit(&ps);while(*s){switch(*s){case '{':case '[':case '(':STPush(&ps,*s);break;case ')':case ']':case '}':if(STSize(&ps) == 0)return false;if(*s == ']' && STTop(&ps) != '['||*s == ')' && STTop(&ps) != '('||*s == '}' && STTop(&ps) != '{'){SLDestroy(&ps);return false;}STPop(&ps);break;}s++;}//防止((出现if(!STEmpty(&ps))return false;return true;
}

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

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

相关文章

Falco操作系统安全威胁监测利器

原理简介 Falco是一个开源的云原生安全工具&#xff0c;用于检测和防御容器和云原生环境中的安全威胁。它基于Linux内核的eBPF技术&#xff0c;通过监控系统调用和内核事件来实现安全检测和响应。 具体来说&#xff0c;Falco的实现原理如下&#xff1a; 1. 内核模块&#xf…

如何使用Spark/Flink等分布式计算引擎做网络入侵检测

如何使用Spark/Flink等分布式计算引擎做网络入侵检测 引言16 Distributed Abnormal Behavior Detection Approach Based on Deep Belief Network and Ensemble SVM Using Spark17 Spark configurations to optimize decision tree classification on UNSW-NB1518 A dynamic spa…

Windows Oracle21C与PLSQL Developer 15配置

1、下载Oracle21c并安装 下载地址&#xff1a;https://www.oracle.com/database/technologies/oracle21c-windows-downloads.html 2、下载PLSQL Developer 15并安装 下载地址&#xff1a;https://www.allroundautomations.com/products/pl-sql-developer/#pricing 3、配置O…

drawio导出矢量图

1.选中要导出的图 2.导出为pdf 3.用adobe打开pdf&#xff0c;另存为eps

NLP文本分类

NLP文本分类 落地实战五大利器&#xff01;_kaiyuan_sjtu的博客-CSDN博客https://zhuanlan.zhihu.com/p/432619164 https://github.com/alibaba/EasyNLP/blob/master/README.cn.md

Lua学习记录

Lua基础了解 Lua的注释通过 (-- 单行注释&#xff0c;--[[ ]] 多行注释)可以不加&#xff1b; 多个变量赋值&#xff0c;按顺序赋值&#xff0c;没有则为nil&#xff1b; function的简单用法&#xff0c;多个返回值配合多重赋值&#xff0c;以end为结束标志 Lua下标从1开始&…

[鹤城杯 2021]Middle magic 解题思路过程

过程 打开题目&#xff0c;是一道PHP的代码审计。代码如下&#xff1a; <?php highlight_file(__FILE__); include "./flag.php"; include "./result.php"; if(isset($_GET[aaa]) && strlen($_GET[aaa]) < 20){$aaa preg_replace(/^(.*)…

opencv带GStreamer之Windows编译

目录 1、下载GStreamer和安装2. GSTReamer CMake配置3. 验证是否配置成功 1、下载GStreamer和安装 下载地址如下&#xff1a; gstreamer-1.0-msvc-x86_64-1.18.2.msi gstreamer-1.0-devel-msvc-x86_64-1.18.2.msi 安装目录无要求&#xff0c;主要是安装完设置环境变量 xxx\1…

6. CSS(三)

目录 一、盒子模型 &#xff08;一&#xff09;网页布局的本质 &#xff08;二&#xff09;盒子模型组成 &#xff08;三&#xff09;边框&#xff08;border&#xff09; &#xff08;四&#xff09;表格的细线边框 &#xff08;五&#xff09;内边距&#xff08;padding…

jupyter默认工作目录的更改

1、生成配置文件&#xff1a;打开Anaconda Prompt&#xff0c;输入如下命令 jupyter notebook --generate-config询问[y/N]时输入y 2、配置文件修改&#xff1a;根据打印路径打开配置文件jupyter_notebook_config.py&#xff0c;全文搜索找到notebook_dir所在位置。在单引号中…

VB6查表法编解Modbus RTU协议CRC16校验码

Modbus RTU协议CRC16编解码用VB6写起来比较啰嗦&#xff0c;需要做一些简单处理。下面就查表法&#xff0c;贴上源代码&#xff0c;并做一些简要说明。 源程序&#xff0c;对照上面的图看更方便。 Private Sub Command2_Click() Dim I As Integer, J As Integer Dim CRCHi As …

微服务03-RabbitMQ

1、简介 MQ,中文是消息中间件(队列)(MessageQueue),字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。 简单来说,消息中间件就是指保存数据的一个容器(服务器),可以用于两个系统之间的数据传递。 几种常见MQ的对比: RabbitMQActiveMQRocketMQKafka公司…