stl-stack+括号配对问题
栈一种容器,遵循先进后出原则,,只能在栈的顶部操作,就像放盘子一样,洗好的盘子叠在上面,需要用时也是先从顶部拿。不允许被遍历。
一、C++stl中的stack语法
- 1.头文件#include<stack>
- 2.top() 返回栈顶元素
- 3.pop() 弹出栈顶元素
- 4.empty()若栈空返回true,非空返回false
- 5.size() 返回栈的元素个数,在c++判断里,0是false,非0是true,作用可以上可以替代empty()
- 6.push() 入栈
栈的经典问题:括号配对问题
描述
现在,有一行括号序列,请你检查这行括号是否配对。
- 输入
- 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[", "]", "(", ")" 四种字符
- 输出
- 每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
- 样例输入
-
- 3
- [(])
- (])
- ([[]()])
- 3
- 样例输出
-
- No
- No
- Yes
- No
- 思路:括号的配对也是遵循栈的工作原理,最里面的括号优先配对。从第一个括号开始遍历,如果是左括号,入栈,如果是右括号并且和栈顶的左括号配对,就出栈一个左括号,通过栈来判断括号是否配对。
AC代码:
- #include<stdio.h>
- #include<iostream>
- #include<algorithm>
- #include<cstring>
- #include<math.h>
- #include<string>
- #include<queue>
- #define ll long long
- #define inf 0x3f3f3f3f
- using namespace std;
- int t;
- string a,b;
- int dp[][];
- int main()
- {
- cin>>t;
- while(t--)
- {
- cin>>a;
- b="";
- int len=a.size();
- for(int i=len-;i>=;i--)
- b=b+a[i];
- //cout<<b<<endl;
- memset(dp,,sizeof(dp));
- for(int i=;i<len;i++)
- {
- for(int j=;j<len;j++)
- {
- if(a[i]==b[j])
- dp[i+][j+]=dp[i][j]+;///当i=j=0并且字符相等时,dp[1][1]中的1代表两个字符串比较的字符个数
- else
- dp[i+][j+]=max(dp[i+][j],dp[i][j+]);
- }
- }
- // printf("%d\n",dp[len][len]);
- printf("%d\n",len-dp[len][len]);
- }
- }
二、java里的Stack类
- mport java.util.Stack;//导入包
- Stack<E> stack=new Stack<E>();//初始化,E表示类,不能是基本类型int之类的
- push(x);//入栈
- pop();//出栈
- peek();//取头元素
- empty();//判空,空为true
- search(x);//寻找元素x距离栈顶的位置,在栈顶返回1,倒数第二入栈的返回2,如果不在栈中返回-1;
例题:CF990C-Bracket Sequences Concatenation Problem
题解:给出好多好多个括号序列,求某两个序列拼起来能构造出完整的括号匹配序列的 序列对数,可以重复使用。
括号序列分4种情况
1.类似“(((())”和“()(((”这类消去自身已经匹配的括号后剩下的全是左括号
2.类似“(())))”和“())))”这类消去自身已经匹配的括号后剩下的全是右括号
3.类似“()()()()”和“(())()”这类自身能作为完整括号匹配的
4.类似“())(”和“)))((())()”这类消去自身已经匹配的括号后剩下的不是以上任意一种的。无论和其他哪个序列拼接都没办法构造出完整的括号匹配序列。
最终答案=相同剩余单边括号数量的第1、2种情况序列数量之和 + 第3种2
- import java.util.Scanner;
- import java.util.Stack;
- public class Main{
- public static void main(String []args){
- long [] l = new long[300005];
- long [] r = new long[300005];
- long ok=0;//圆满的序列
- long ans=0;
- Scanner scan=new Scanner(System.in);
- int n;
- while(scan.hasNext()) {
- ans=0;
- ok=0;
- n=scan.nextInt();
- for(int i=1;i<=n;i++){
- Stack<Character> stack=new Stack<Character>();
- String s=scan.next();
- int len=s.length();
- for(int j=0;j<len;j++){
- Character x=s.charAt(j);
- if(x=='(')//左括号直接入栈
- stack.push(x);
- if(x==')') {//右括号判断栈顶,如果是(则弹出
- if(!stack.empty()&&stack.peek()=='(')
- stack.pop();
- else//空或者里面也是)
- stack.push(x);
- }
- }
- boolean flag=true;//判断这个字符串可不可以作为题目要求的序列
- int left=0,right=0;
- while(!stack.empty()) {
- Character now=stack.peek();
- stack.pop();
- if(now=='(')
- left++;
- else
- right++;
- if(left!=0 && right!=0) {
- flag=false;
- break;
- }
- }
- if(flag==true) {
- if(left==0 && right==0)
- ok++;
- else if(left!=0)
- l[left]++;
- else
- r[right]++;
- }
- }
- for(int i=1;i<300005;i++) {
- ans=ans+(l[i]*r[i]);
- l[i]=r[i]=0;
- }
- ans=ans+ok*ok;
- System.out.println(ans);
- }
- }
- }
CF990C
stl-stack+括号配对问题的更多相关文章
- hdoj 2 括号配对问题【数组模拟实现+STL实现】
栈遵循先进后出的原则 括号配对问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0 ...
- Num 15: NYOJ: 题目0002 : 括号配对问题 [ 栈(stack) ]
原题连接 首先要了解有关栈的一些基本知识,即: 什么是栈,栈有什么作用: 1.什么是栈: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkb ...
- ACM:UESTC - 649 括号配对问题 - stack
UESTC - 649 括号配对问题 Time Limit: 1000MS Memory Limit: 65535KB 64bit IO Format: %lld & %llu ...
- 括号配对问题_栈<stack>
问题 A: 括号配对问题 时间限制: 3 Sec 内存限制: 128 MB提交: 3 解决: 2[提交][状态][讨论版] 题目描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行 ...
- nyoj 2 括号配对问题(stack)
括号配对问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0& ...
- NYOJ之括号配对问题
括号配对问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N&l ...
- ACM 括号配对问题
括号配对问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=1 ...
- nyoj 2 括号配对问题
括号配对问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0& ...
- 括号配对问题--nyoj-2(栈)
括号配对问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=10 ...
随机推荐
- yield对性能提升的一次小小测试
生成器提供了一种更容易的方法来实现简单的对象迭代,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低.生成器允许你在 foreach 代码块中写代码来迭代一组数据而不需要在内存中 ...
- 【jmeter】jMeter使用Badboy录制Web测试脚本
JMeter 是纯Java编写的软件功能和性.能测试工具,其录制脚本过于笨拙和复杂.而Badboy是用C++开发的动态应用测试工具,其拥有强大的屏幕录制和回放 功能,同时提供图形结果分析功能,刚好弥补 ...
- 在 Windows 上使用 Cygwin
引用:http://www.ibm.com/developerworks/cn/aix/library/au-spunix_cygwin/#resources Cygwin 是一个用于 Microso ...
- 关于有时候导入maven项目时候报错(有红色叹号,类中导入的包提示"the import java.util cannot be resolve,")
------解决方案--------------------解决方案:右键项目-------buildpath--------最下面那个configura...的选择libraries找到JRE(这个 ...
- mysql 按照 where in 排序
select * from user_extend where `unique` in('mark.liu@xxxx.com','jason.gan@xxxx.com','ssgao@xxxx.com ...
- 【用jersey构建REST服务】系列文章
1.用Jersey构建RESTful服务1--HelloWorld http://blog.csdn.NET/kkkloveyou/article/details/21391033 2.用Jersey ...
- Xss漏洞原理分析及简单的讲解
感觉百度百科 针对XSS的讲解,挺不错的,转载一下~ XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XS ...
- Dubbo与Zookeeper、Spring整合使用
Dubbo与Zookeeper.Spring整合使用 Dubbo采用全spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spri ...
- 2018ICPC网络赛(焦作站)K题题解
一.题目链接 https://nanti.jisuanke.com/t/31720 二.题意 给$N$种船只,第$i$种船的载重量是$V_i$,数量是$2^{C_i}-1$.接下来有$Q$次询问,每次 ...
- windows下面安装easy_install和pip教程
方便安装whl:安装完成后,可以使用pip install xxx.whl 安装一个python轮子 python扩展库的路径:Python\Python36\Lib\site-packages\ ...