数据结构(二):括号匹配(C++,栈)
好家伙,写题,题目代码在最后
来吧,
1.栈
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。
这一端被称为栈顶,相对地,把另一端称为栈底。
向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;
从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。 ——百度百科
上图
总之,我们记住这玩意"先进后出"就行了
举个栗子,(假设水倒入杯子后不会流动)
就像你烧了一壶水,拿个杯子倒水,然后喝了一口
你喝的第一口水是你最后倒进去的
而你最先倒进去的水在最下面
最后倒进去的水最先喝到
最先倒进去的最后喝到
这就是先进后出了
(是不是拿固体举例子会比较好...)
方法以及标识:
//头文件
#include <stack> //实例化字符类型的栈
stack <char> sta;
常用方法:
1.1.sta.top()方法
函数用于访问栈顶元素
1.2.sta.pop()
函数用于移除栈顶元素
1.3.sta.size()
函数返回堆栈元素的数量。堆栈元素的数量是指堆栈的大小。
堆栈元素的大小是非常重要的信息,因为基于它我们可以推断出许多其他内容,例如所需的空间等。
1.4.sta.push(new_obj)
函数用于在栈顶添加新元素
1.5.sta.empty()
函数用于测试容器是否为空
2.题目如下:
输入一串字符串,该字符串只能由各种不同的括号组成,设计算法,测试该字符串中的括号是否匹配。
如:“({[]})”该字符串中括号是匹配的,字符串“[{{}(”是不匹配的,要求采用栈的思想来完成该题目
2.1.分析一波题目:
我们用栈去解决这个题目(不然为什么会有上面的内容)
这种对称的题目用栈来做就是很舒服
利用栈的先进后出的特点,我们可以进行左右括号的匹配,“(){}”,在右括号“)}”左边最近的左括号必须是相对应的“({”,否则就不合法
先把左半边的括号全部入栈,然后按入栈的反顺序依次去查对应右括号,(如先入"{("那么就先查")}")
若果出现不匹配,则返回false,
每次匹配一对正确的括号,就要将其出栈,为后面的括号腾出空间。
上代码:
#include <iostream>
#include <stack> using namespace std; bool isValid(string s) {
stack <char> sta;
char c,b;
int l=s.length();
for(int i=0;i<l;i++)
{
//将所有的左半边括号入栈
if(s[i]=='(' || s[i]=='[' || s[i]=='{')
{
sta.push(s[i]);
}
//对后面的元素逐一检查
//三种情况
//1.栈空了,返回false
//2.成功匹配,将成功匹配的字符出栈
//3.其他情况,返回false
else if(s[i]==')')
{
if(sta.empty())
return false;
else if(c=sta.top(),c=='(')
sta.pop();
else
return false;
}
else if(s[i]==']')
{
if(sta.empty())
return false;
else if(c=sta.top(),c=='[')
sta.pop();
else
return false;
}
else if(s[i]=='}')
{
if(sta.empty())
return false;
else if(c=sta.top(),c=='{')
sta.pop();
else
return false;
}
}
if(sta.empty())
return true;
else
return false;
} int main()
{
string s;
cin>>s;
//输入字符
bool b=true; b=isValid(s);
if(b==true)
cout << "true";
else cout << "false";
return 0;
}
输入样例:
输入: ({}(000))
输出: true
数据结构(二):括号匹配(C++,栈)的更多相关文章
- YTU 3003: 括号匹配(栈和队列)
3003: 括号匹配(栈和队列) 时间限制: 1 Sec 内存限制: 128 MB 提交: 2 解决: 2 [提交][状态][讨论版] 题目描述 假设一个表达式中只允许包含三种括号:圆括号&quo ...
- OJP1147括号匹配加强版(栈)与P1153乱头发节(单调栈)
惨兮兮的被刷掉2%的通过率后在经过思考和dalao的指点后终于A掉了这道题 强烈建议修改这题的样例,实在太迷惑人,各种错误算法都能过 比如说这是一份错误代码,看懂了也不要学思路,和正解不知道差到哪里去 ...
- 数据结构2_java---栈,括号匹配
package Main; import java.util.Scanner; import javax.swing.text.html.HTMLDocument.HTMLReader.Isindex ...
- C++学习之:括号匹配与栈的使用
#include <stack> using std::stack ; 变量定义: stack<T> stackName ; 成员函数: 成员函数 功能 bool empt ...
- 洛谷 - P1739 - 表达式括号匹配 - 模拟 - 栈
https://www.luogu.org/problemnew/show/P1739 虽然应该是用栈的……但是直接模拟就可以了. #include<bits/stdc++.h> usin ...
- java:数据结构(二)栈的应用(括号匹配)
一.什么是括号匹配: 括号匹配就是利用计算机辨别表达式里面的括号是否书写成功 例如: {()((a)) }这就是一个正确 (()() 这就是一个错误的 二.括号匹配的算法: 众所周知,括号分为花括 ...
- SDUT-2134_数据结构实验之栈与队列四:括号匹配
数据结构实验之栈与队列四:括号匹配 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给你一串字符,不超过50个字符,可能 ...
- php栈数据结构和括号匹配算法
栈,体现的是后进先出,即LIFO.队列,体现的是先进先出,即FIFO. 栈 array_pop() //尾出 array_push() //尾进 或 array_shift()//头进 array_u ...
- STL-stack和顺序栈实现括号匹配
2018-11-11-14:28:31 1.顺序栈 下面是我用数组实现的顺序栈,包含的函数有出入栈,查看栈顶元素,栈的大小,栈是否空等函数,当栈空间不够用时,对应的数组会自动增长. /******** ...
- Python面试题:使用栈处理括号匹配问题
括号匹配是栈应用的一个经典问题, 题目 判断一个文本中的括号是否闭合, 如: text = "({[({{abc}})][{1}]})2([]){({[]})}[]", 判断所有括 ...
随机推荐
- **手把手教你安装 Anaconda + Tensor flow+Pycharm**
手把手教你安装 Anaconda + Tensor flow+Pycharm 这篇博文主要讲一下自己安装Anaconda + Tensor flow + Pycharm 的一个过程. 1. ANACO ...
- C++ 指针与二维数组名
和一维数组类似,C++ 将二维数组名解释为其第一个元素的地址,而二维数组的第一个元素为一维数组,以下面的程序为例,二维数组名 array2d 和 &array2d[0] 等效,它们的类型都为 ...
- Java 热更新 Groovy 实践及踩坑指南
Groovy 是什么? Apache的Groovy是Java平台上设计的面向对象编程语言.这门动态语言拥有类似Python.Ruby和Smalltalk中的一些特性,可以作为Java平台的脚本语言使用 ...
- 2021年3月-第02阶段-前端基础-Flex 伸缩布局-移动WEB开发_flex布局
移动web开发--flex布局 1.0 传统布局和flex布局对比 1.1 传统布局 兼容性好 布局繁琐 局限性,不能再移动端很好的布局 1.2 flex布局 操作方便,布局极其简单,移动端使用比较广 ...
- 24 个 Docker 常见问题处理技巧
转载自:https://mp.weixin.qq.com/s/PoyXyZUVQEiJfNac2qShkw
- Elasticsearch:ICU分词器介绍
ICU Analysis插件是一组将Lucene ICU模块集成到Elasticsearch中的库. 本质上,ICU的目的是增加对Unicode和全球化的支持,以提供对亚洲语言更好的文本分割分析. 从 ...
- 使用nginx-ingress-controller配置https,但是再同时配置使用http
默认情况下,如果为该 Ingress 启用了 TLS,控制器会使用 308 永久重定向响应将 HTTP 客户端重定向到 HTTPS 端口 443.( Ingress 里配置了 https 证书的话,默 ...
- 在 CentOS 8/RHEL 8 上安装和使用 Cockpit
Cockpit 是一个基于 Web 的服务器管理工具,可用于 CentOS 和 RHEL 系统.最近发布的 CentOS 8 和 RHEL 8,其中 cockpit 是默认的服务器管理工具.它的软件包 ...
- NSIS检测并统计字符串中某个字符个数
!include "LogicLib.nsh" OutFile "检查找字符串中c出现的次数.exe" Name "test" Sectio ...
- WSL 2 上启用微软官方支持的 systemd
以前折腾了很久的 genie 和 distrod 来实现 wsl2 上的 systemd.现在微软和Canonical联合声明发布了官方支持的systemd,之前的折腾貌似有点浪费时间了.如果微软不发 ...