题目描述

给定一个由括号组成的字符串

问其是否为一个合法的括号序列

合法的括号序列的定义如下

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-括号序列-栈的入门的更多相关文章

  1. ZR#331. 【18 提高 3】括号序列(栈)

    题意 挺神仙的.首先$60$分暴力是比较好打的. 就是枚举左端点,看右端点能否是$0$ 但是这样肯定是过不了的,假如我们只枚举一次,把得到的栈记录下来 那么若区间$(l, r)$是可行的,那么$s_{ ...

  2. Catalan数,括号序列和栈

    全是入门的一些东西.基本全是从别处抄的. 栈: 支持单端插入删除的线性容器. 也就是说,仅允许在其一端加入一个新元素或删除一个元素. 允许操作的一端也叫栈顶,不允许操作的一端也叫栈底. 数个箱子相叠就 ...

  3. 洛谷 P1241 括号序列(栈)

    嗯... 题目链接:https://www.luogu.org/problem/P1241 首先这道题是栈的入门题的加强版, 不仅要你判断这个括号序列是否合法,还要你将这个序列补充完整... 一开始是 ...

  4. 栈+括号序列+暴力枚举——cf1248D1

    这个复杂度首先就想到是n3的复杂度,n2枚举换的位置,求值在花费n复杂度 判断一个序列有多少独立的括号子串时用栈处理一下即可 /* 枚举交换两个括号的位置,然后再对新的序列判一次即可 */ #incl ...

  5. lintcode: 有效的括号序列

    题目: 有效的括号序列 给定一个字符串所表示的括号序列,包含以下字符: '(', ')', '{', '}', '[' and']', 判定是否是有效的括号序列. 样例 括号必须依照 "() ...

  6. 洛谷 P1241 括号序列

    P1241 括号序列 题目描述 定义如下规则序列(字符串): 1.空序列是规则序列: 2.如果S是规则序列,那么(S)和[S]也是规则序列: 3.如果A和B都是规则序列,那么AB也是规则序列. 例如, ...

  7. UVA-673 括号匹配--栈

    如果是一个合法的序列,每对配对的括号的两个字符('(' 和 ')' 或者 '[' 和 ']')一定是相邻的,每次判断下该字符是否有配对即可. 如果配对,将左括号出栈即可.特别注意:空格也是合法的. A ...

  8. 有效的括号序列——算法面试刷题4(for google),考察stack

    给定一个字符串所表示的括号序列,包含以下字符: '(', ')', '{', '}', '[' and ']', 判定是否是有效的括号序列. 括号必须依照 "()" 顺序表示, & ...

  9. [leetcode]20. Valid Parentheses有效括号序列

    Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...

随机推荐

  1. php 连接mysql 主机 localhost,显示 No such file or directory

    打开 php.ini文件,找到这1行 mysql.default_socket 然后将它修改为 mysql.default_socket=/path/to/mysql.sock /path/to/my ...

  2. Centos 添加 sudo 用户

    说明以下的 <username>字样 是 用户名 新增用户 # 终端命令 useradd <username> 举例: useradd <username> -s ...

  3. tomcat 优化到每秒并发1000

    tomcat并发线程数能达到多少? 答:tomcat 优化到每秒并发1000,需要以下优化: 一.优化tomcat中的配置(包括tomcat APR(Apache Portable Runtime)优 ...

  4. HDU5669

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:传送门  Portal  原题目描述在最下面.  给你n个点 ...

  5. [转]WinForm DataGridView 绑定泛型List(List<T>)/ArrayList不显示的原因和解决

    背景:无意间遇到了一个不大不小的问题,希望对一些遇到的人有所帮助! 一.问题 WinForm DataGridView 绑定泛型List (List<T>)/ArrayList不显示,UI ...

  6. LeetCode刷题笔记-贪心法-格雷编码

    题目描述: 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异. 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列.格雷编码序列必须以 0 开头. 来源:力扣(Leet ...

  7. 编译Solr4.72 源码没有成功

    最近需要用到solr,查询Hbase里面的数据,编译Solr的时候遇到了点问题: 下了solr的源码后需要用ant自己编译: 源码下载地址:https://svn.apache.org/repos/a ...

  8. Web UI 设计(网页设计)命名规范

    Web UI 设计命名规范 一.网站设计及基本框架结构: 1.    Container“container“ 就是将页面中的所有元素包在一起的部分,这部分还可以命名为: “wrapper“, “wr ...

  9. 21-1字符串相关api

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Docker学习のC/S模式

    我们操作docker是通过命令行客户端,然后和守护进程通信 以前的是通过命令行 我们还可以通过RemoApI的形式,通过自己的程序访问docker 和守护进程链接方式