括号匹配的检验(数据结构实训)

发布于:2023-12-07 ⋅ 阅读:(113) ⋅ 点赞:(0)

题目:

括号匹配的检验
标准输入输出
题目描述:
采用栈实现,练习进栈入栈函数的编写.
输入:
输入的第一行包含一个数,n
n表示要用例的个数
接下来是n行由括号构成的字符串,包含‘(’、‘)’、‘[’、‘]’。

输出:
对每一测试用例,用一行输出结果,如果匹配,输出“YES”,否则输出“NO”

输入样例:
2
[([][]())]
)[]()

输出样例:
YES
NO

代码:

题目的左右小括号是中文的,但是使用应该是英文的,一开始我用方法一写没写出来,还以为是题目的问题,于是写了方法二,后来找到了方法一的错误,现在的方法一是正确的

方法一(普通方法):

import java.util.Scanner;
public class Xingyuxingxi {
    public static void main(String[] args) {
        int a;
        Scanner sc = new Scanner(System.in);
        String b;
        a = sc.nextInt();
        while (a-- != 0) {
            b = sc.next();
            int zxk = 0;
            int zzk = 0;
            int cnt=0;
            for (int i = 0; i < b.length()-1; i++) {
                if((b.charAt(i)=='('&&b.charAt(i+1)==']')||(b.charAt(i)=='['&&b.charAt(i+1)==')'))
                {
                    cnt=1;
                    break;
                }
            }
            if(cnt==0) {
                for (int i = 0; i < b.length(); i++) {
                    if (b.charAt(i) == '(') {
                        zxk++;
                    }
                    if (b.charAt(i) == ')') {
                        zxk--;
                    }
                    if (b.charAt(i) == '[') {
                        zzk++;
                    }
                    if (b.charAt(i) == ']') {
                        zzk--;
                    }
                    if (zxk < 0 || zzk < 0) {
                        break;
                    }
                }
            }
            if ( cnt == 0&&zxk == 0 && zzk == 0) {
                System.out.println("YES");
            } else {
                System.out.println("NO");
            }
        }
    }
}

/*
当时卡在样例
(([))]
此时输出应该为NO
在我写栈方法时检查了出来
*/

方法二(栈):

import java.util.Scanner;
import java.util.Stack;

public class Xingyuxingxi {
    public static void main(String[] args) {
        Stack<Character>zhan =new Stack<Character>();
        Scanner sc=new Scanner(System.in);
        int a=sc.nextInt();
        String b;
        while (a--!=0)
        {
            b=sc.next();
            for (int i = 0; i <b.length() ; i++) {
                char s=b.charAt(i);
                if(i!=0&&((s==')'&&zhan.peek()=='(')||(s==']'&&zhan.peek()=='[')))
                {
                    zhan.pop();
                }
                else
                {
                    zhan.push(s);
                }
            }
            if(zhan.isEmpty())
            {
                System.out.println("YES");
            }
            else
            {
                System.out.println("NO");
            }
            zhan.clear();
        }
    }
}
/*
peek()方法,调用栈顶元素
pop()方法,删除栈顶元素
isEmpty()方法,判断栈是否为空
clear()方法,清空栈
*/

 

 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到