当前位置:编程学习 > JAVA >>

一个算法题。求解

描述 现在,有一行括号序列,请你检查这行括号是否配对。
输入第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符输出每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
import java.util.*;
import java.io.*;
public class Test2 {
public static void main(String []args){
Scanner i = new Scanner(System.in);
int a=i.nextInt();
String c[] = new String[5];
Stack<Character> s =new Stack<Character>();
char st1;
boolean match[] =new boolean[5];
for(int k=0;k<a;k++){
Scanner sc = new Scanner(System.in);
String st=sc.nextLine();
c[k]=st;
}
for(int k=0;k<a;k++){
 match[k]=true;
for(int j=0;j<c[k].length();j++){
st1=c[k].charAt(j);
if(st1=='('||st1=='['){
s.push(st1);
}

if(st1==')'||st1==']'){
if(s.empty()){
match[k]=false;
break;
}
else if((st1==')'&&s.peek()=='(')||(st1==']'&&s.peek()=='['))
   s.pop();   
else {match[k]=false; break;}
}
}
if(!s.empty()) match[k]=false;
//s=null;
}

for(int k =0;k<a;k++){
if(match[k])
    System.out.println("Yes");
else
   System.out.println("No");}

  }
}

为什么调试的组数多了 就出现单组调试对 多组里一起调试就错 --------------------编程问答-------------------- 没仔细看你的代码, 再处理一下输入的地方应该就没事了
import java.util.*;

public class Test {
    public static void main(String[] args) {
        System.out.println(bracketsMatched("([])"));  // matched
        System.out.println(bracketsMatched("([(])")); // unmatched
        System.out.println(bracketsMatched("((['']))")); // unmatched
    }

    public static boolean bracketsMatched(String str) {
        Stack<String> stack = new Stack<String>();

        for (int i = 0; i < str.length(); ++i) {
            char ch = str.charAt(i);
            switch(ch) {
            case '(':
            case '[':
                stack.push(ch + "");
                break;
            case ')':
            case ']':
                stack.pop();
                break;
            default:
                return false;
            }
        }

        return stack.empty();
    }
}
--------------------编程问答--------------------
public static boolean bracketsMatched(String str) {
        Stack<Character> stack = new Stack<Character>(); // [[1]] 这里可以改一下

        for (int i = 0; i < str.length(); ++i) {
            char ch = str.charAt(i);
            switch(ch) {
            case '(':
            case '[':
                stack.push(ch); // [[2]] 这里可以改一下
                break;
            case ')':
            case ']':
                stack.pop();
                break;
            default:
                return false;
            }
        }

        return stack.empty();
    }
--------------------编程问答--------------------
引用 2 楼 Inhibitory 的回复:
Java code?123456789101112131415161718192021public static boolean bracketsMatched(String str) {        Stack<Character> stack = new Stack<Character>(); // [[1]] 这里可以改一下         for (int i ……

能帮我看看我的代码哪里错了么。
是不是因为栈没清空?
不想直接照着你的代码敲,想搞懂为什么会出现这种情况。谢谢。 --------------------编程问答-------------------- 【(】)这样的能解决么?你没有严格的验证闭合吧 --------------------编程问答--------------------
引用 4 楼 fatg1988 的回复:
【(】)这样的能解决么?你没有严格的验证闭合吧

可以解决啊。 --------------------编程问答-------------------- 有点错误,忘了匹配
import java.util.*;
 
public class Test {
    public static void main(String[] args) {
        System.out.println(bracketsMatched("([])"));  // matched
        System.out.println(bracketsMatched("([(])")); // unmatched
        System.out.println(bracketsMatched("((['']))")); // unmatched
    }
 
    public static boolean bracketsMatched(String str) {
        Stack<Character> stack = new Stack<Character>();
char temp;
 
        for (int i = 0; i < str.length(); ++i) {
            char ch = str.charAt(i);
            switch(ch) {
            case '(':
            case '[':
                stack.push(ch);
                break;
            case ')':
temp = stack.pop();
if (temp != '(') { return false; }
break;
            case ']':
                temp = stack.pop();
if (temp != '[') { return false; }
break;
            default:
                return false;
            }
        }
 
        return stack.empty();
    }
}
--------------------编程问答-------------------- case ')':
temp = stack.pop();
if (temp != '(') { return false; }
break;
这里不判断空栈么?
import java.util.Scanner;
import java.util.Stack;
public class test {
public static void main(String[] args) {
Scanner i = new Scanner(System.in);
int a=i.nextInt();
String c[] = new String[5];
Stack<Character> s =new Stack<Character>();
char st1;
boolean match[] =new boolean[5];
//输入的组数
for(int k=0;k<a;k++){
Scanner sc = new Scanner(System.in);
String st=sc.nextLine();
c[k]=st;
}
//判断每组结果
for(int k=0;k<a;k++){
 match[k]=true;
 int ip=0;
s: 
for(int j=0;j<c[k].length();j++){
st1=c[k].charAt(j);           
         switch(st1) {            
         case '(':           
         case '[':                
         s.push(st1);ip++; break;           
         case ')':     
         if(s.empty()) break s;
         else if(s.peek()=='('){ s.pop(); break;}
         else break s;
         case ']':  
         if(s.empty()) break s;
         else if(s.peek()=='[') {s.pop();  break; }    
         else break s;
         default:           
         }
}
 //判断栈为空的两种情况
if(ip==0) match[k]=false;
else if(s.empty()) match[k]=true;
else match[k]=false;
}
//输出最后结果
for(int k =0;k<a;k++){
if(match[k])
    System.out.println("Yes");
else
   System.out.println("No");
}
}

}
还是有一个问题 当输入 
3
)))
((
[]
输出结果是 NO NO NO 为什么啊?
补充:Java ,  Java相关
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,