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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangcheng_95/article/details/78134189

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

输入:第一行输入一个数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;
    }
}

猜你喜欢

转载自blog.csdn.net/zhangcheng_95/article/details/78134189