程序目的是要求找出对应的缺失括号,并标出位置例如:(1+2-[+{那么缺失括号为(,[,{
位置分别为1,6,8我做的程序可以在1--10个字符中查找,但如果10个以上就会有错误,而且根本理不出头绪,下面是我尝试查找10个以上字符但失败的程序,希望大家能帮帮我,我是自学的,还不到一个月,如果有低级错误大家别笑,第一次来这,再次感谢大家帮忙!!!
//java.ioを呼び出し
import java.io.*;//クラス"goal2"を設定する
public class Catch
{   //異常値をスローします
public static void main(String[] args)throws IOException 
{
//文字列を設定
String mystring;
   
//括弧のタイプ、「(」は1である一方、「)」は2です。
int K=1|3|5;
int i;

   
 //文字列の入力ストリーム
StringBuffer dummy=new StringBuffer();
    BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
    System.out.println("対象を入力して下さい:");
    mystring=buf.readLine();
   
   
for( i=0;i<mystring.length();i++)
{

if('('==mystring.charAt(i)|'{'==mystring.charAt(i)|'['==mystring.charAt(i))
{
if ('('==mystring.charAt(i))
{
K=1;
//括弧のタイプをdummyに入れます
dummy.append(String.valueOf(K));
//posをdummyに入れます
dummy.append(String.valueOf(i+1));
}
else if('{'==mystring.charAt(i))
{
K=3;
//括弧のタイプをdummyに入れます
dummy.append(String.valueOf(K));
//posをdummyに入れます
dummy.append(String.valueOf(i+1));
}
else if('['==mystring.charAt(i))
{
K=5;
//括弧のタイプをdummyに入れます
dummy.append(String.valueOf(K));
//posをdummyに入れます
dummy.append(String.valueOf(i+1));
}

}
else if(')'==mystring.charAt(i)||'}'==mystring.charAt(i)||']'==mystring.charAt(i))
{
  
  if (mystring.length()<10)
  {
if(')'==mystring.charAt(i))
{

if(0!=dummy.length())
{
if (dummy.charAt(dummy.length()-2)=='1')
{
//dummyの末から削除します
dummy.delete(dummy.length()-2,dummy.length());
}
else if(dummy.charAt(dummy.length()-2)=='3')
{
System.out.println("対応の「(」が見つかなかった"+"posは"+(i+1)+"です。");
}
else 
System.out.println("対応の「(」が見つかなかった"+"posは"+(i+1)+"です。");
}


else 
System.out.println("対応の「(」が見つかなかった"+"posは"+(i+1)+"です。");//dummyに入れずに、出力します
}
if('}'==mystring.charAt(i))
{

if(0!=dummy.length())
{
if (dummy.charAt(dummy.length()-2)=='3')
{
//dummyの末から削除します
dummy.delete(dummy.length()-2,dummy.length());
}
else if(dummy.charAt(dummy.length()-2)=='5')
{
System.out.println("対応の「{」が見つかなかった"+"posは"+(i+1)+"です。");
}
else
System.out.println("対応の「{」が見つかなかった"+"posは"+(i+1)+"です。");
}
else
System.out.println("対応の「{」が見つかなかった"+"posは"+(i+1)+"です。");
}
if(']'==mystring.charAt(i))
{


if(0!=dummy.length())
{
if (dummy.charAt(dummy.length()-2)=='5')
{
//dummyの末から削除します
dummy.delete(dummy.length()-2,dummy.length());
}
else if(dummy.charAt(dummy.length()-2)=='1')
{
System.out.println("対応の「[」が見つかなかった"+"posは"+(i+1)+"です。");
}
else
System.out.println("対応の「[」が見つかなかった"+"posは"+(i+1)+"です。");
}
else
System.out.println("対応の「[」が見つかなかった"+"posは"+(i+1)+"です。");
}
}

  else if (mystring.length()>=10)
  { if(')'==mystring.charAt(i))
{

if(0!=dummy.length())
{
if (dummy.charAt(dummy.length()-2)=='1')
{
//dummyの末から削除します
dummy.delete(dummy.length()-2,dummy.length());
}
else if(dummy.charAt(dummy.length()-2)=='3')
{
System.out.println("対応の「(」が見つかなかった"+"posは"+(i+1)+"です。");
}
else 
System.out.println("対応の「(」が見つかなかった"+"posは"+(i+1)+"です。");
}


else 
System.out.println("対応の「(」が見つかなかった"+"posは"+(i+1)+"です。");//dummyに入れずに、出力します
}
if('}'==mystring.charAt(i))
{

if(0!=dummy.length())
{
if (dummy.charAt(dummy.length()-2)=='3')
{
//dummyの末から削除します
dummy.delete(dummy.length()-2,dummy.length());
}
else if(dummy.charAt(dummy.length()-2)=='5')
{
System.out.println("対応の「{」が見つかなかった"+"posは"+(i+1)+"です。");
}
else
System.out.println("対応の「{」が見つかなかった"+"posは"+(i+1)+"です。");
}
else
System.out.println("対応の「{」が見つかなかった"+"posは"+(i+1)+"です。");
}
if(']'==mystring.charAt(i))
{


if(0!=dummy.length())
{
if (dummy.charAt(dummy.length()-2)=='5')
{
//dummyの末から削除します
dummy.delete(dummy.length()-2,dummy.length());
}
else if(dummy.charAt(dummy.length()-2)=='1')
{
System.out.println("対応の「[」が見つかなかった"+"posは"+(i+1)+"です。");
}
else
System.out.println("対応の「[」が見つかなかった"+"posは"+(i+1)+"です。");
}
else
System.out.println("対応の「[」が見つかなかった"+"posは"+(i+1)+"です。");
}

  }
  

}
}while(dummy.length()!=0)
{


if (dummy.charAt(dummy.length()-2)=='1')
{
System.out.println("対応の「)」が見つかなかった"+"posは"+dummy.charAt(dummy.length()-1)+"です");

dummy.delete(dummy.length()-2,dummy.length());
}
else if (dummy.charAt(dummy.length()-2)=='3')
{
System.out.println("対応の「}」が見つかなかった"+"posは"+dummy.charAt(dummy.length()-1)+"です");

dummy.delete(dummy.length()-2,dummy.length());

}
        
else if (dummy.charAt(dummy.length()-2)=='5')
{
System.out.println("対応の「]」が見つかなかった"+"posは"+dummy.charAt(dummy.length()-1)+"です");

dummy.delete(dummy.length()-2,dummy.length());
}


}
}
}

解决方案 »

  1.   

    1.初始化一个empty stack,然后扫描输入字符串。2.如果是{ ( [ 入操作栈 ; 如果是} ) ] 就判断是否等于栈顶元素,不等直接error返回,等就出栈。3.最后判断栈是不是空。
      

  2.   

    感谢帮忙的各位,我重新修改了下程序,为了帮助我的各位,将日文改成了英文;在1-10个字符范围内,程序可以顺利取值,超过10则出现错误代码如下,再次感谢大家//use java.io
    import java.io.*;
    public class Catch
    {   //throw the error
    public static void main(String[] args)throws IOException 
    {

    String mystring;
       
    //1is "(",2is"{",3is"["
    int K=1|3|5;
    int i;

       
     //input words 
    StringBuffer dummy=new StringBuffer();
        BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
        System.out.println("please input a string");
        mystring=buf.readLine();
       
       
    for( i=0;i<mystring.length();i++)
    {

    if('('==mystring.charAt(i)|'{'==mystring.charAt(i)|'['==mystring.charAt(i))
    {
    if ('('==mystring.charAt(i))
    {
    K=1;
    //get the type into dummy
    dummy.append(String.valueOf(K));
    //get the pos into dummy
    dummy.append(String.valueOf(i+1));
    }
    else if('{'==mystring.charAt(i))
    {
    K=3;

    dummy.append(String.valueOf(K));

    dummy.append(String.valueOf(i+1));
    }
    else if('['==mystring.charAt(i))
    {
    K=5;

    dummy.append(String.valueOf(K));

    dummy.append(String.valueOf(i+1));
    }

    }
    else if(')'==mystring.charAt(i)||'}'==mystring.charAt(i)||']'==mystring.charAt(i))
    {
      

    if(')'==mystring.charAt(i))
    {

    if(0!=dummy.length())
    {
    if (dummy.charAt(dummy.length()-2)=='1')
    {
    //delete what have inputed
    dummy.delete(dummy.length()-2,dummy.length());
    }
    else if(dummy.charAt(dummy.length()-2)=='3')
    {
    System.out.println("「(」can not found"+"pos is"+(i+1));
    }
    else 
    System.out.println("「(」can not found"+"pos is"+(i+1));
    }


    else 
    System.out.println("「(」can not found"+"pos is"+(i+1));//directly output
    }
    if('}'==mystring.charAt(i))
    {

    if(0!=dummy.length())
    {
    if (dummy.charAt(dummy.length()-2)=='3')
    {

    dummy.delete(dummy.length()-2,dummy.length());
    }
    else if(dummy.charAt(dummy.length()-2)=='5')
    {
    System.out.println("「{」can not found"+"pos is"+(i+1));
    }
    else
    System.out.println("「{」can not found"+"pos is"+(i+1));
    }
    else
    System.out.println("「{」can not found"+"pos is"+(i+1));
    }
    if(']'==mystring.charAt(i))
    {


    if(0!=dummy.length())
    {
    if (dummy.charAt(dummy.length()-2)=='5')
    {

    dummy.delete(dummy.length()-2,dummy.length());
    }
    else if(dummy.charAt(dummy.length()-2)=='1')
    {
    System.out.println("「[」can not found"+"pos is"+(i+1));
    }
    else
    System.out.println("「[」can not found"+"pos is"+(i+1));
    }
    else
    System.out.println("「[」can not found"+"pos is"+(i+1));
    }
    }
    }



    while(dummy.length()!=0)
    {


    if (dummy.charAt(dummy.length()-2)=='1')
    {
    System.out.println("「)」can not found"+"pos is"+dummy.charAt(dummy.length()-1));

    dummy.delete(dummy.length()-2,dummy.length());
    i--;
    }
    else if (dummy.charAt(dummy.length()-2)=='3')
    {
    System.out.println("「}」can not found"+"pos is"+dummy.charAt(dummy.length()-1));

    dummy.delete(dummy.length()-2,dummy.length());

    }
            
    else if (dummy.charAt(dummy.length()-2)=='5')
    {
    System.out.println("「]」can not found"+"pos is"+dummy.charAt(dummy.length()-1));

    dummy.delete(dummy.length()-2,dummy.length());
    }


    }
    }

    }
      

  3.   

    这个由于需要输出不匹配括号的位置,所以采用栈的形式并不合适。重新写了一个,你试试看吧,不是很聪明的,比较笨~~我加了一些注释,可以的话就用用,今晚可别回不去家啊~~import java.util.Arrays;
    import java.util.Set;
    import java.util.TreeSet;public class StaticTest {    // 左括号数组
        public static char[] LEFT = {'{', '[', '('};
        // 右括号数组(左右括号的位置需要一样)
        public static char[] RIGHT = {'}', ']', ')'};
        
        public static void main(String[] args) {        
            String str = "(1+2-[4+{8+8";          
            Set<Integer> set = checkBrakets(str);
            showMessage(str, set);
        }
        
        /**
         * 检查括号的匹配情况
          * @param str 表达式
          * @return 含有不匹配括号的索引位置集合
          */
        public static Set<Integer> checkBrakets(String str) {
            char[] chars = str.toCharArray();
            Set<Integer> set = new TreeSet<Integer>();
            int offset1 = 0;
            int offset2 = chars.length;
            // 找到最左边左括号的索引
             int startIndex = startBraketIndex(str, offset1);
            // 当左括号时
             while (startIndex > -1) {
                // 找出最右边的右括号
                 int endIndex = endBraketIndex(str, offset2);
                // 找出左括号的类型,即在左括号数组中的索引位置,便于找出右括号
                 int index = findBraket(str.charAt(startIndex), LEFT);   
                // 当没有右括号,或者是左右的括号类型不一样
                 if( endIndex == -1 || RIGHT[index] != str.charAt(endIndex)) {
                    // 将左括号的索引位置记下
                      set.add(startIndex);                
                } else {
                    // 当括号完全匹配时                              
                      // endBraketIndex搜索的开始位置往左移
                      offset2 = endIndex;
                }
                // startBraketIndex搜索的开始位置往右移
                  offset1 = startIndex + 1;
                // 继续从左边开始找左括号
                  startIndex = startBraketIndex(str, offset1);
            }
            return set;
        }
        
        /**
         * 输出括号匹配检查结果
          * @param str
         * @param errorIndex
         */
        public static void showMessage(String str, Set<Integer> errorIndex) {
            char[] arrows = new char[str.length()];
            Arrays.fill(arrows, ' ');
            int k = 0;
            for(Integer i : errorIndex) {
                System.out.print(i + 1);
                if(k < errorIndex.size() - 1) {
                    System.out.print(", ");
                }
                arrows[i] = '^';
                k++;
            }
            System.out.println();
            System.out.println(str);
            System.out.println(new String(arrows));
        }
        
        /**
         * 从startIndex向左开始搜寻第一个左括号
          * @param str
         * @param startIndex 从左边开始的索引点
          * @return
         */
        private static int startBraketIndex(String str, int startIndex) {
            char[] chars = str.toCharArray();
            for(int i = startIndex; i < chars.length; i++) {
                if(findBraket(chars[i], LEFT) > -1) {
                    return i;
                }
            }
            return -1;
        }
        
        /**
         * 从lastIndex向0开始搜寻第一个右括号
          * @param str
         * @param lastIndex 从右边开始的索引点
          * @return
         */
        private static int endBraketIndex(String str, int lastIndex) {
            char[] chars = str.toCharArray();
            for(int i = lastIndex - 1; i >= 0; i--) {
                if(findBraket(chars[i], RIGHT) > -1) {
                    return i;
                }
            }
            return -1;
        }
        
        /**
         * 在括号数组中搜寻括号,以判断是哪一种括号
          * @param c 任意字符
          * @param chars 括号数组
          * @return 括号数组的索引点,没有返回-1
         */
        private static int findBraket(char c, char[] chars) {
            for(int i = 0; i < chars.length; i++) {
                if(c == chars[i]) {
                    return i;
                }
            }
            return -1;
        }
    }
      

  4.   

    bao110908的方法似乎有点问题String str="()[]{}";//程序判断结果是:
    1, 3
    ()[]{}
    ^ ^ 
      

  5.   

    呵呵,昨天回去家了,谢谢bao110908的帮助,我用了别的方式实现了,但是您贴出的代码仍然对我十分宝贵,再次感谢帮助,各位圣诞快乐!!!