【问题标题】:How to determine if a text has balanced delimiters?如何确定文本是否具有平衡分隔符?
【发布时间】:2012-07-23 10:35:16
【问题描述】:

我有这个问题,

编写一个函数来确定文本是否具有平衡的分隔符。有效分隔符对是 ()、[]、{} 和 。它们可能是嵌套的。此外,确定文本分隔符 ' 和 " 正确匹配。

顺便说一句,我正在用java编码..

对于每条测试线,如果有平衡分隔符,则输出为“1”,否则为“0”。

下面的例子,

4 --- 0

{123} --- 1

{qweqwe{sdad} --- 0

问题是,我怎样才能用java代码来检查这对有效的分隔符是否匹配?抱歉,我对分隔符知之甚少。

下面是我的代码..

public static void main(String args[]) {
        String a1 = "";
        try {
            Scanner readFile = new Scanner(new File("2.in.txt"));
            while (readFile.hasNextLine()) {

                a1 = readFile.nextLine();
                System.out.println(a1);
                if (a1.equals("18")) {
                    System.out.println("0");
                } else {
                    System.out.println("1");
                }
            }
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
            return;
        }
    }

【问题讨论】:

    标签: java delimiter


    【解决方案1】:

    这个问题的一般解决方案是使用堆栈。对于每个输入字符串,从一个空堆栈开始:

    • 遇到左括号时,将其推入堆栈。
    • 遇到右括号时,从堆栈中弹出并与右括号进行比较以查看它们是否是匹配对。如果没有,请返回false。如果是,请继续。

    当你遍历完字符串后,检查堆栈是否为空。如果是,返回true,否则返回false。

    对于引号' 和" 的情况,如果您不允许引号在同一个引号内,并且您不考虑转义语法,那么解决方案应该是相同的。

    【讨论】:

    • 是的,它有帮助!但是可以详细说明这些引号'和“,我如何检查这些引号是否匹配?就像括号匹配的东西一样..
    • @Amazinglykai:我不是说它们会是一样的吗(在某些假设下)?否则,您需要仔细定义应该如何进行转义。
    【解决方案2】:

    看看this code,它解决了类似的任务。

    import java.util.Stack;
    
    class BracketChecker {
      private String input;
    
      public BracketChecker(String in) {
        input = in;
      }
    
      public void check() {
        Stack<Character> theStack = new Stack<Character>();
    
        for (int j = 0; j < input.length(); j++) {
          char ch = input.charAt(j);
          switch (ch) {
          case '{': 
          case '[':
          case '(':
            theStack.push(ch);
            break;
          case '}': 
          case ']':
          case ')':
            if (!theStack.isEmpty()) {
              char chx = theStack.pop();
              if ((ch == '}' && chx != '{') || (ch == ']' && chx != '[') || (ch == ')' && chx != '('))
                System.out.println("Error: " + ch + " at " + j);
            } else
    
              System.out.println("Error: " + ch + " at " + j);
            break;
          default:
            break;
          }
        }
        if (!theStack.isEmpty()){
          System.out.println("Error: missing right delimiter");
        }
      }
    }
    
    public class MainClass {
      public static void main(String[] args) {
        String input;
        input = "[]]()()";
    
        BracketChecker theChecker = new BracketChecker(input);
        theChecker.check();
      }
    
    }
    

    【讨论】:

      【解决方案3】:
      boolean symbolsBalanced(String delimiter){
          String delimiters = "[]{}<>()";
          String text = "{(){}(){()(()())}}";
          Stack<Character> myStack= new Stack<Character>();
          int length = delimiters.length();
          left = new char[length/2];
          right = new char[length/2];
          for (int i=0; i<length/2; i++) {
              left[i] = delimiters.charAt(i+i); //It will contain [,{,<,(
              right[i] = delimiters.charAt(i+i+1); //It will contain ],},>,)
          }
      
          int tLen = text.length();
          for (int i=0; i<tLen; i++) {
              char c = text.charAt(i);
              for(int j=0; j<left.length; j++) {
                  if(left[j]==c) {
                      //If start braces is present, add in stack
                      myStack.add(c);
                      break;
                  }
              }
              for(int j=0; j<right.length; j++) {
                  if(right[j]==c) {
                      //If stack is empty, then no use to continue the operation
                      if(myStack.isEmpty()) return false;
                      //If end braces is present, pop from stack
                      myStack.pop();
                      break;
                  }
              }
          }
          if(myStack.isEmpty()) return true;
          return false;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-21
        • 1970-01-01
        • 2013-12-16
        • 2015-05-16
        • 2015-12-16
        • 1970-01-01
        • 2017-03-07
        相关资源
        最近更新 更多