初学编程练习题:括号配对问题(Java)

来源:互联网 发布:sqlserver删除历史数据 编辑:程序博客网 时间:2024/06/07 12:52

*问题描述:
现在,有一行括号序列,检查这行括号是否配对。

输入:第一行输入一个数N,表示有N组测试数据,N>0且N<=100。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有”[“,”]”,”(“,”)”四种字符
输出:
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出“Yes”,如果不配对则输出“No”*

示例:
输入:
4
[(]
{}
{[)]{}[
([{}])

输出:
No
Yes
No
No
Yes

解决思路:对于这一问题,可以使用栈的思想来解决,将字符串中的每个字符提取,遇到左括号‘{’、‘[’、‘(’,便将其入栈,如果遇到右括号,便将栈顶字符和其配对,如果不配对,则该字符串不满足要求,如果配对成功,便将栈顶字符弹出栈即可。
这里需要注意的几点是:
1.当字符串的长度是奇数时,可以直接判断为不匹配。(不过好像对时间影响不大,不加也可以)
2.当遇到右括号时,需要先判断是否栈为空,不然就GG了,想想整个字符串只有右括号的情况(或者左括号比右括号少)。
3.当然,还要考虑下整个字符串只有左括号的情况(或者右括号比左括号少),即匹配工作做完了,还要判断下栈是否为空(如果里面还有左括号在等着也GG啊)
OK,下面附上代码(我也是初学者啊,所以程序开销并不完美,注释都是中文的…只是解决了问题,欢迎大神指正)

import java.util.*;import java.io.*;public class Main {    public static void main(String[] args){        Scanner input=new Scanner(System.in);         int N=input.nextInt();        input.nextLine();//清空输入        String[] p=new String[N];//用来标注每一行字符串是否匹配        String[] s=new String[N];//接收字符串        for(int i=0;i<N;i++)            s[i]=input.nextLine();        for(int i=0;i<N;i++)            if(Match(s[i]))//调用函数,判断是否匹配                p[i]="Yes";            else                p[i]="No";        for(int i=0;i<N;i++)            System.out.println(p[i]);    }    public static boolean Match(String s){        if(s.length()%2!=0)            return false;//字符串是奇数,不匹配        char[] stack=new char[s.length()];        int top=-1;        for(int i=0;i<s.length();i++){            if(s.charAt(i)=='{'||s.charAt(i)=='['||s.charAt(i)=='(')                stack[++top]=s.charAt(i);            else if(s.charAt(i)==']'){                if(top==-1||stack[top]!='[')//先判断栈是否为空再匹配,top==-1要在前                    return false;                else                    top--;            }            else if(s.charAt(i)==')'){                if(top==-1||stack[top]!='(')                    return false;                else                    top--;            }            else if(s.charAt(i)=='}'){                if(top==-1||stack[top]!='{')                    return false;                else                    top--;            }        }        if(top!=-1)            return false;//栈不为空        return true;    }}
原创粉丝点击