AYITOJ-括号序列-栈的入门
题目描述
给定一个由括号组成的字符串
问其是否为一个合法的括号序列
合法的括号序列的定义如下
1. 空字符串是合法的括号序列
2. 若字符串A是合法的括号序列, 那么{A},[A],(A)也是合法的括号序列
3. 若字符串A,B是合法的括号序列, AB也是合法的括号序列
例如 {} ,[] , ({}()[]) 是合法的括号序列, ({)}则不是
输入格式:
一行, 一个仅含括号(){}[]的字符串
输出格式:
一行, "YES"表示字符串是合法的括号序列, 否则输出"NO"
样例输入1:
({}()[])
样例输出1:
YES
样例输入2:
({)}
样例输出2:
NO
数据范围
保证 |s|<=105|s|<=105
子任务1:(10分)
保证 |s|<=10|s|<=10
子任务2:(10分)
保证 |s|<=103|s|<=103
子任务3:(20分)
题意:第一次做的时候运行正确,但是提交错误,搞了半天是自己题意理解有问题。正确的题意:有三种括号{}、[]、(),每一个括号内部要有其他的完整的括号(括号数量>=0)即可,但是必须是完整的。完整的输出YES,否则输出NO。
思路:一种方法是可以用for循环模拟一遍,另外一种更直观也更好理解,就是用栈写,因为栈的特点就是后进先出。具体操作见代码的注释。
栈的基本操作:和队列进行对比,栈是一个后进先出的线性表,插入和删除元素只能在表的一端进行。
栈顶:插入元素的一端。
栈底:插入元素的另一端。
入栈:插入元素(push)。
出栈:删除元素(op)。
头文件:#include<stack>
其他操作见如下代码注释:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<map>
#include<stack>//头文件
using namespace std; stack<char>s;//首先需要像队列一样进行声明
int main()
{
string ss;
ss.erase();
cin>>ss;
for(int i=; i<ss.length(); i++)
{
if(s.empty())//如果栈为空,则插入元素,即将元素入栈。栈为空返回为真
s.push(ss[i]);//入栈操作push()
else if(s.top()=='(')//访问栈顶元素top(),即整个栈最上面的元素,看成线性的话,则是最右边的元素,去进行匹配
{
if(ss[i]==')')//如果正好可以和当前for循环走到的元素进行匹配的话,则删除栈顶元素
s.pop();//删除栈顶元素,也就是出栈,出栈操作pop()
else
s.push(ss[i]);
}
else if(s.top()=='[')
{
if(ss[i]==']')
s.pop();
else
s.push(ss[i]);
}
else if(s.top()=='{')
{
if(ss[i]=='}')
s.pop();
else
s.push(ss[i]);
}
else
s.push(ss[i]);
}
if(s.empty())//如果为空则返回为真,输出YES
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return ;
}
AYITOJ-括号序列-栈的入门的更多相关文章
- ZR#331. 【18 提高 3】括号序列(栈)
题意 挺神仙的.首先$60$分暴力是比较好打的. 就是枚举左端点,看右端点能否是$0$ 但是这样肯定是过不了的,假如我们只枚举一次,把得到的栈记录下来 那么若区间$(l, r)$是可行的,那么$s_{ ...
- Catalan数,括号序列和栈
全是入门的一些东西.基本全是从别处抄的. 栈: 支持单端插入删除的线性容器. 也就是说,仅允许在其一端加入一个新元素或删除一个元素. 允许操作的一端也叫栈顶,不允许操作的一端也叫栈底. 数个箱子相叠就 ...
- 洛谷 P1241 括号序列(栈)
嗯... 题目链接:https://www.luogu.org/problem/P1241 首先这道题是栈的入门题的加强版, 不仅要你判断这个括号序列是否合法,还要你将这个序列补充完整... 一开始是 ...
- 栈+括号序列+暴力枚举——cf1248D1
这个复杂度首先就想到是n3的复杂度,n2枚举换的位置,求值在花费n复杂度 判断一个序列有多少独立的括号子串时用栈处理一下即可 /* 枚举交换两个括号的位置,然后再对新的序列判一次即可 */ #incl ...
- lintcode: 有效的括号序列
题目: 有效的括号序列 给定一个字符串所表示的括号序列,包含以下字符: '(', ')', '{', '}', '[' and']', 判定是否是有效的括号序列. 样例 括号必须依照 "() ...
- 洛谷 P1241 括号序列
P1241 括号序列 题目描述 定义如下规则序列(字符串): 1.空序列是规则序列: 2.如果S是规则序列,那么(S)和[S]也是规则序列: 3.如果A和B都是规则序列,那么AB也是规则序列. 例如, ...
- UVA-673 括号匹配--栈
如果是一个合法的序列,每对配对的括号的两个字符('(' 和 ')' 或者 '[' 和 ']')一定是相邻的,每次判断下该字符是否有配对即可. 如果配对,将左括号出栈即可.特别注意:空格也是合法的. A ...
- 有效的括号序列——算法面试刷题4(for google),考察stack
给定一个字符串所表示的括号序列,包含以下字符: '(', ')', '{', '}', '[' and ']', 判定是否是有效的括号序列. 括号必须依照 "()" 顺序表示, & ...
- [leetcode]20. Valid Parentheses有效括号序列
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...
随机推荐
- html中没有不能随意嵌套的标签
在HTML里有几个元素是比较特别的:<ul>.<ol>.<dl>.<table>,它们的子一层必须是指定元素,<ul>.<ol> ...
- JavaWeb 二维码
说明 相关包 zxing-core3.3 zxing-javase3.3 junit4.12 POM文件 <dependency> <groupId>com.google.zx ...
- 经典单调栈最大子矩形——牛客多校第二场H
题目是求次大子矩形,那么在求最大子矩形的时候维护M1,M2即可 转移M2时比较的过程要注意一下 #include<bits/stdc++.h> using namespace std; # ...
- BZOJ 4031: [HEOI2015]小Z的房间(Matrix Tree)
传送门 解题思路 矩阵树定理模板题.矩阵树定理是求图中最小生成树个数,做法是首先求出基尔霍夫矩阵,就是度数矩阵\(-\)邻接矩阵.然后再求出这个矩阵的行列式,行列式的求法就是任意去掉一行一列,然后高斯 ...
- NOIp2018集训test-9-8(pm) (联考一day2)
把T1题读错了,想了一个多小时发现不可做.然后打了t2,常数不优秀.然后去打t3,lct,结果打挂爆0了. 然后今天就爆炸了. 如果这是noip我今年就可以直接回去学常规了.学常规多好,多开心. 今天 ...
- NX二次开发-比较两个string是否相等
NX11+VS2013 #include <uf.h> #include <uf_ui.h> UF_initialize(); string A = "ABC&quo ...
- 手机网站Meta的使用
meta指元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词. 标签位于文档的头部,不包含任何内容. 标签的属性定义了与文档相关联的名称/值对. ...
- RocketMQ核心技术精讲与高并发抗压实战
1:特点 比较吃内存 内存至少1g 默认8g 1:支持集群模型,强调集群无单点,负载均衡以及水平扩展能力2:亿级别的消息堆积能力3:采用零拷贝原理Consumer 消费消息过程,使用了零拷贝 顺序写盘 ...
- Springboot整合dubbo搭建基本的消费、提供和负载均衡
文章目录 1.确定接口 2.创建提供者 2.1 pom配置 2.2dubbo配置文件 2.3 application.properties 2.4 mybatis相关 2.4.1 配置UserMapp ...
- mysql tar安装模式
mysql解压版安装过程,之前安装mysql一直用linux yum和rpm方式.今天试了下tar包方式有点麻烦记录下1.安装lrzsz-0.12.20-27.1.el6.x86_64.rpm方便操作 ...