括号配对问题
时间限制:3000 ms | 内存限制:65535 KB
难度:3
-
描述
- 现在,有一行括号序列,请你检查这行括号是否配对。
-
输入
- 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符 输出
- 每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No 样例输入
-
3 [(]) (]) ([[]()])
样例输出 -
No No Yes
该题是典型的栈的应用,遇见“[”或者“(”,压入栈中。
如果遇见“)”或者“]”,把栈顶元素和当前括号比对是否可以配对,如果可以,就出栈,否则不能匹配。
例如:[([ ][ ])],下面模拟这个过程
1.s:[
2.s:[(
3.s:[([
4.s:[([ 来了一个“]”,栈顶元素是“[”,和“]”可以配对,出栈。
s:[(
5:s:[([
6.s:[([ 来了一个“]”,栈顶元素是“[”,和“]”可以配对,出栈。
s:[(
7.s:[( 来了一个“)”,栈顶元素是“(”,和“)”可以配对,出栈。
s:[
8.s:[ 来了一个“]”,栈顶元素是“[”,和“]”可以配对,出栈。
s:
代码如下:
01.#include
<stdio.h>02.int main()03.{04.int n,i,j,s;05.char k[10003],r,p[10000];06.scanf("%d",&n);07.for(j=0;j<n;j++)08.{09.i=1;s=0;10.scanf("%s",p);11.while(r=p[s++])12.{13.if(r=='('||r=='[')
k[i++]=r;14.else if(r==')')15.{16.if(k[i-1]=='(')
i--;17.else {i=10;break;}18.}19.else if(r==']')20.{21.if(k[i-1]=='[')
i--;22.else {i=10;break;}23.}24.}25.if(i>1) printf("No\n");26.else printf("Yes\n"); 27.}28.return 0;29.}
本文详细介绍了如何使用栈数据结构解决括号配对问题,包括输入解析、栈操作和输出判断,提供了完整的代码实现及流程模拟。
265

被折叠的 条评论
为什么被折叠?



