括号配对问题nyist 4h

19 篇文章 0 订阅
14 篇文章 0 订阅

括号配对问题

时间限制: 3000  ms  |  内存限制: 65535  KB
难度: 3
描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])
样例输出
No
No
Yes
方法一:使用LinkedList
 
package com.qiujy.corejava12;
import java.util.LinkedList;
import java.util.Scanner;
public class Army2 {
 public static void main(String[] args) {
  Scanner in = new Scanner(System.in);
  int n = in.nextInt();
//System.out.println();
  for (int i = 0; i < n; i++) {
   int k = 0,flag=1;
   LinkedList link = new LinkedList();
   // char [] str =new char[10010];
   String st = new String(in.next());
   if (st.length() % 2==1 ) {
    System.out.println("No");
    flag=0;
    continue;
   }
   else {
    for (int j = 0; j < st.length(); j++) {
     /*System.out.println("charAt("+j+")="+st.charAt(j));
     if (link.contains("[") ||link.contains("(")){
     System.out.println("link("+j+")="+link.getLast());}*/
     if (st.charAt(j) == '[' || st.charAt(j) == '(') {
      link.add( String.valueOf(st.charAt(j)));
     }
     else{ 
   //   if (!(link.contains("[")) && !(link.contains("("))){
      if(Link.size()==0){ 
        flag=0;
        break;
      }
      else {
        if(st.charAt(j) == ']'){
         
          if(link.getLast().equals("[")){
              link.removeLast();
          }
          else {
           flag=0;
           break;
           
          }
        }
           
          else{ if(st.charAt(j) == ')'){
            
                 if(link.getLast().equals("(")) {
                 link.removeLast();
             }
                 else { 
                  flag=0;
               break;
                  
                 }
           }
          }
       }
     }
     
    }
   }
   
   if (flag==0||link.contains("[") || link.contains("("))
    System.out.println("No");
   else
    System.out.println("Yes");
  }
 }
}
方法2:
  
  
  1. //不用栈的情况,用数组超时  
//不用栈的情况,用数组超时
  1. import java.util.Scanner;  
  2. public class Main {//NYOJ02---括号配对问题   
  3.     public static void main(String[] args) {  
  4.         Scanner input=new Scanner(System.in);  
  5.         int n=input.nextInt();  
  6.         while(n-->0){  
  7.             String str=input.next();  
  8.             boolean ok=true;  
  9.             int e=0;  
  10.             Is is[]=new Is[10000];//相当于栈   
  11.             for(int i=0;i<str.length();i++){  
  12.                 if(str.charAt(i)=='['||str.charAt(i)=='('){  
  13.                     is[e++]=new Is(str.charAt(i));//如果是左括号,进栈   
  14.                     continue;  
  15.                 }  
  16.                 if(e==0){//是右括号且栈空,不配对   
  17.                     System.out.println("No");  
  18.                     ok=false;//标志一下防止多次输出No   
  19.                     break;  
  20.                 }  
  21.                 if(str.charAt(i)==')'&&is[e-1].a=='(')//栈不为空且配对,出栈   
  22.                     e--;  
  23.                 else if(str.charAt(i)==']'&&is[e-1].a=='[')  
  24.                           e--;  
  25.                 else{//不配对   
  26.                     System.out.println("No");  
  27.                     ok=false;  
  28.                     break;  
  29.                 }  
  30.             }  
  31.             if(ok&&e==0){//最后栈为空,配对   
  32.                 System.out.println("Yes");  
  33.             }  
  34.             else if(ok)//防止多次输出No   
  35.                 System.out.println("No");  
  36.         }  
  37.     }  
  38.       
  39. }  
  40. class Is{//相当于栈   
  41.     char a='0';  
  42.     Is(char a){  
  43.         this.a=a;  
  44.     }  
  45. }  
import java.util.Scanner;
public class Main {//NYOJ02---括号配对问题
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		int n=input.nextInt();
		while(n-->0){
			String str=input.next();
			boolean ok=true;
			int e=0;
			Is is[]=new Is[10000];//相当于栈
			for(int i=0;i<str.length();i++){
				if(str.charAt(i)=='['||str.charAt(i)=='('){
					is[e++]=new Is(str.charAt(i));//如果是左括号,进栈
					continue;
				}
				if(e==0){//是右括号且栈空,不配对
					System.out.println("No");
					ok=false;//标志一下防止多次输出No
					break;
				}
				if(str.charAt(i)==')'&&is[e-1].a=='(')//栈不为空且配对,出栈
					e--;
				else if(str.charAt(i)==']'&&is[e-1].a=='[')
						  e--;
				else{//不配对
					System.out.println("No");
					ok=false;
					break;
				}
			}
			if(ok&&e==0){//最后栈为空,配对
				System.out.println("Yes");
			}
			else if(ok)//防止多次输出No
				System.out.println("No");
		}
	}
	
}
class Is{//相当于栈
	char a='0';
	Is(char a){
		this.a=a;
	}
}

 

 

方法3:用栈:

 

 

  1.    
  2. import java.io.BufferedReader;  
  3. import java.io.InputStreamReader;  
  4. import java.util.Scanner;  
  5. import java.util.Stack;  
  6.   
  7. public class Main {  
  8.   
  9.     public static void main(String[] args) {  
  10. //      Scanner in = new Scanner(System.in);   
  11.         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
  12.         String str = null;  
  13.         Stack<Character> stack = new Stack<Character>();  
  14.         //      int cases = in.nextInt();   
  15.         try{  
  16.             int cases = Integer.valueOf(br.readLine());  
  17.             while(cases-->0){  
  18. //              str = in.next();   
  19.                 str = br.readLine();  
  20.                 int strLength = str.length();  
  21.                 boolean isMatch = true;  
  22.                 stack.clear();  
  23.                 stack.push('#');  
  24.                 for(int i = 0; i < strLength; ++i){  
  25.                     char ch = str.charAt(i);  
  26.                     switch(ch){  
  27.                     case '(':  
  28.                         stack.push(ch);  
  29.                         break;  
  30.                     case '[':  
  31.                         stack.push(ch);  
  32.                         break;  
  33.                     case ')':  
  34.                         if(stack.pop() != '('){  
  35.                             isMatch = false;  
  36.                         }  
  37.                         break;  
  38.                     case ']':  
  39.                         if(stack.pop() != '['){  
  40.                             isMatch = false;  
  41.                         }  
  42.                         break;  
  43.                     default:  
  44.                         isMatch = false;  
  45.                         break;  
  46.                     }  
  47.                     if(!isMatch){  
  48.                         break;  
  49.                     }  
  50.                 }  
  51.                 if(isMatch&&stack.pop()=='#'){  
  52.                     System.out.println("Yes");  
  53.                 }else{  
  54.                     System.out.println("No");  
  55.                 }  
  56.             }  
  57.         }catch(Exception e){  
  58.             e.printStackTrace();  
  59.         }  
  60.     }  
  61. }          
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.Stack;

public class Main {

	public static void main(String[] args) {
//		Scanner in = new Scanner(System.in);
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = null;
		Stack<Character> stack = new Stack<Character>();
		//		int cases = in.nextInt();
		try{
			int cases = Integer.valueOf(br.readLine());
			while(cases-->0){
//				str = in.next();
				str = br.readLine();
				int strLength = str.length();
				boolean isMatch = true;
				stack.clear();
				stack.push('#');
				for(int i = 0; i < strLength; ++i){
					char ch = str.charAt(i);
					switch(ch){
					case '(':
						stack.push(ch);
						break;
					case '[':
						stack.push(ch);
						break;
					case ')':
						if(stack.pop() != '('){
							isMatch = false;
						}
						break;
					case ']':
						if(stack.pop() != '['){
							isMatch = false;
						}
						break;
					default:
						isMatch = false;
						break;
					}
					if(!isMatch){
						break;
					}
				}
				if(isMatch&&stack.pop()=='#'){
					System.out.println("Yes");
				}else{
					System.out.println("No");
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}        


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值