栈和队列1——栈的实现及其oj(括号匹配问题)

一,栈的概念

栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。
在这里插入图片描述
通俗来说就是先进入的数据最后出来,最后进去的数据先出来就比如我们在一个细管子中放入石头,那么最开始放的石头在最底下,最后放的石头就在管口,把石头倒出来,那最先出来的石头就是管口的。

二,栈的结构

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。由于刚刚上面的定义介绍我们直到,栈这种结构他只能尾插和尾删,所以这种情况下选择数组是非常方便的。他的结构就和顺序表是非常像的。

typedef int STDataType;
typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;

这里的top就是栈顶位置的下一个

三,栈的实现

//初始化
void STInit(ST* ps);
//销毁
void STDestroy(ST* ps);
//插入
void STPush(ST* ps, STDataType x);
//删除
void STPop(ST* ps);
//找top位置的数据
STDataType STTop(ST* ps);
//一共有多少个数据
int STSize(ST* ps);
//判断是否为空
bool STEmpty(ST* ps);

3.1栈的初始化

//初始化
void STInit(ST* ps)
{assert(ps);ps->a = NULL;ps->capacity = ps->top = 0;
}

3.2栈的销毁

//销毁
void STDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->capacity = ps->top = 0;
}

3.3栈的插入

//插入
void STPush(ST* ps, STDataType x)
{assert(ps);//先判断容量是否够if (ps->capacity == ps->top){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);if (tmp == NULL){perror("realloc fail");exit(-1);}ps->capacity = newcapacity;ps->a = tmp;}ps->a[ps->top] = x;++ps->top;
}

这里我们判断扩容的函数直接写到了插入里面是因为,栈只有一个插入,而之前的顺序表的时候插入的方式非常多,所以单独分开写梗方便我们去利用。

3.3栈的删除

	//删除void STPop(ST* ps){assert(ps);assert(ps->top > 0);--ps->top;}

3.4栈顶元素的值

//找top位置的数据
STDataType STTop(ST* ps)
{assert(ps);return ps->a[ps->top - 1];
}

我们最开始提到top是栈顶元素的下一个位置,所以我们在找栈顶元素的时候,要减一。

3.5计算栈一共的数据

//一共有多少个数据
int STSize(ST* ps)
{assert(ps);return ps->top;
}

3.6判断是否为空

//判断是否为空
bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}

四,测试

void text1()
{ST st;STInit(&st);STPush(&st, 1);STPush(&st, 2);STPush(&st, 3);STPush(&st, 4);STPush(&st, 5);while (!STEmpty(&st)){printf("%d ", STTop(&st));STPop(&st);}printf("\n");STDestroy(&st);
}
int main()
{text1();return 0;
}

在这里插入图片描述

五,题目练习(有效的括号)

括号匹配问题
在这里插入图片描述

5.1分析

我们可以让左括号入栈,右括号出栈,进行比较,同样的要注意左右括号数量也要保持一致。

5.2代码

bool isValid(char * s){ST st;STInit(&st);char topval;while(*s){//左括号入栈switch(*s){case '{':case '[':case '(':STPush(&st,*s);break;case '}':case ']':case ')':if(STEmpty(&st)){STDestroy(&st);return false;}topval=STTop(&st);STPop(&st);if(*s=='}'&&topval!='{'||*s==']'&&topval!='['||*s==')'&&topval!='('){return false;}break;}s++;}bool val=STEmpty(&st);STDestroy(&st);    return val;
}

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

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

相关文章

【lesson7】git的介绍及使用

文章目录 什么是gitgit的历史git使用在gitee上创建仓库git clone HTTPS地址git add .git add 文件名git commit “日志”git pushgit loggit rm 文件名git statusgit pull 什么是git git是版本控制器,那么什么是版本控制器呢? 下面讲个故事为大家讲解一…

【SpringBoot】90、SpringBoot中@Value(“${...}“)的使用细节

@Value 注解可以用来将外部的值动态注入到 Bean 中,在 @Value 注解中,可以使${} 与 #{} ,它们的区别如下: @Value(“${}”):可以获取对应属性文件中定义的属性值。@Value(“#{}”):表示 SpEl 表达式通常用来获取 bean 的属性,或者调用 bean 的某个方法。根据注入的内容来…

SpringBoot开发实战(微课视频版)

ISBN: 978-7-302-52819-7 编著:吴胜 页数:311页 阅读时间:2023-06-24 推荐指数:★★★★☆ 本文介绍SpringBoot 2.0.5 、JDK 1.8,虽然现在已经不维护了,但是大体的流程还是对口的, 而且书里面讲…

Vite + Vue3 实现前端项目工程化

通过官方脚手架初始化项目 第一种方式,这是使用vite命令创建,这种方式除了可以创建vue项目,还可以创建其他类型的项目,比如react项目 npm init vitelatest 第二种方式,这种方式是vite专门为vue做的配置,…

【算法】滑动窗口破解长度最小子数组

Problem: 209. 长度最小的子数组 文章目录 题意分析算法原理讲解暴力枚举O(N^2)利用单调性,滑动窗口求解 复杂度Code 题意分析 首先来分析一下本题的题目意思 题目中会给到一个数组,我们的目的是找出在这个数组中 长度最小的【连续】子数组,而…

c++加速方法大全

我们平常写代码的时候,经常超时,非常难受,所以,我写了这篇文章,让你的代码提升速度(这些方法作者亲测有效,用了这些方法,足足提升了1秒!虽然最后题目还是没过&#xff09…

JVM 篇

目录 一、知识点汇总 二、知识点详解 2.1 JVM 的主要组成部分及其作用 2.2 JVM内存模型 2.3 堆与栈的区别 2.4 JVM 加载 class 文件的原理机制 2.5 类的生命周期 2.6 Java 对象结构 2.7 Java 对象创建过程 2.8 指针碰撞 2.9 空闲列表 2.10 TLABCAS 2.11 说…

蓝牙电话之HFP—电话音频

1 媒体音频: 播放蓝牙音乐的数据,这种音频对质量要求高,数据发送有重传机制,从而以l2cap的数据形式走ACL链路。编码方式有:SBC、AAC、APTX、APTX_HD、LDAC这五种编码方式,最基础的编码方式是SBC&#xff0…

Mysql 三级等保安全加固

安全加固的前提是保障业务稳定运行,而不是为了安全加固而加固! 1. 新增审计账号并赋予相关权限 进入数据库操作后台: mysql -h 192.168.101.17-u root -p查看数据库用户和口令信息: select host,user,plugin,authentication_string from mysql.user;查看用户权限: show …

什么是多态,instanceof,类型转换

多态 即同一个方法可以根据发送对象的不同而采用多种不同的行为方式一个对象的实际类型是确定的,按可以指向对象的引用类型有很多多态存在的条件: 有继承关系子类重写父类的方法父类引用指向子类对象 注意:多态是方法的多态,属性…

【Vue入门】语法 —— 事件处理器、自定义组件、组件通信

目录 一、事件处理器 1.1 样式绑定 1.2 事件修饰符 1.3 按键修饰符 1.4 常用控制符 1.4.1 常用字符综合案例 1.4.2 修饰符 二、自定义组件 2.1 组件介绍及定义 2.2 组件通信 2.2.1 组件传参(父 -> 子) 2.2.1 组件传参(子 ->…

Goland设置头注释

package ${GO_PACKAGE_NAME} * Author: 坐公交也用券 * HomePage: https://liumou.site * File: ${NAME}.go * Date: ${DATE} ${TIME} * Des: 文件作用

什么是AES加密?详解AES加密算法原理流程

在密码学中,加密算法分为双向加密和单向加密。单向加密包括MD5、SHA等摘要算法,它们是不可逆的。双向加密包括对称加密和非对称加密,对称加密包括AES加密、DES加密等。双向加密是可逆的,存在密文的密钥。AES算法是DES算法的替代者…

Linux 操作技巧

目录 一、shell-命令解释器 二、Linux中的特殊符号 三、命令历史--history 一、shell-命令解释器 shell——壳,命令解释器,负责解析用户输入的命令 ——内置命令(shell内置) ——外置命令,在文件系统的某个目录下&…

数据库中的DDL与DML

标签:数据库 记录下DDL和DML的相关概念。 数据定义语言 定义数据库模式 数据定义语言DDL(Data-Definition Language)可定义数据库模式。数据库模式在之前的文章中已经提到过了。简单来说,建表用的SQL语句就是DDL。如下代码 CREATE TABLE department(de…

3、靶场——Pinkys-Place v3(3)

文章目录 一、获取flag41.1 关于SUID提权1.2 通过端口转发获取setuid文件1.3 运行pinksecd文件1.4 利用nm对文件进行分析1.5 构建payload1.6 Fire 二、获取flag52.1 生成ssh公钥2.2 免密登录ssh2.3 以pinksecmanagement的身份进行信息收集2.4 测试程序/usr/local/bin/PSMCCLI2.…

安装MySQL

要安装MySQL,您可以按照以下步骤进行操作。这里将介绍如何在Linux上安装MySQL。请注意,这只是一个基本的示例,具体步骤可能会因您的操作系统和版本而有所不同。 在Ubuntu上安装MySQL: 打开终端。 更新包列表以确保获取最新的软件包信息&…

CoreData 在新建或更新托管对象中途发生错误时如何恢复如初?

问题现象 在 CoreData 支持的 App 中,当我们新建或更新托管对象到一半突然出现错误时,应该禁止任何已发生的改变被写入内存或数据库中。不过,有时仍会出现始料未及的“意外”: 从上面的演示可以看到:即使在 Item 对象新建和更新途中出现错误后不执行后续的保存操作,但界…

Windows安装Mysql--免安装版

在Windows系统上安装免安装版MySql的步骤 官方下载地址:https://dev.mysql.com/downloads/mysql/ 将下载好的文件“mysql-5.7.18-winx64”解压缩到C盘的 目录下: 配置环境变量: (略) 正式安装,添加my.i…