使用堆栈分析(ABC)^ n的字符串

时间:2014-07-01 07:23:19

标签: java string

我有一串字符As,Bs和Cs,我需要分析语言(ABC)^ n,其中n> 0。如果这个字符串是" ABCABCABC"这是真的,如果它是" ABAB"或" AB"这不是真的。当它读取一行" AB"时,我不断收到错误消息字符串索引的界限。然后它会停止程序。 这是我的代码:

public boolean isABC(String line) throws StackException{
    MyStack Stack = new MyStack();

    // initialize loop counters
    int i = 0;
    int n = line.length();
    char ch = line.charAt(i);

    // Push all 'A's to L6Stack 
    while (i < line.length()){
        if(line.charAt(i) == 'A'){
            L6Stack.push(ch);
            i++;
            if(line.charAt(i)=='B'){
                L6Stack.push(ch);
                i++;
                if(line.charAt(i) =='C'){
                    L6Stack.push(ch);
                    i++;
                }else
                    break;
            }else
                break;
        }else
            break;
    }
    if (i == n ){
        return true; 
    }else
        return false;
}

3 个答案:

答案 0 :(得分:4)

您的代码尝试前进3个字符,然后检查是否可以在不超出边界的情况下执行此操作。您可以使用i++替换所有if (i==n) return false; i++来解决此问题。但是,您也可以将其全部重写为 lot 清洁工:

试试这个:

public boolean isABC(String line) {
  int total = line.length();
  int position = 0;
  char prev = 'C';
  while (position < total) {
      char c = line.get(position++);
      switch (c) {
          case 'A': if (prev != 'C') return false; break;
          case 'B': if (prev != 'A') return false; break;
          case 'C': if (prev != 'B') return false; break;
      }
      prev = c;
  }
  return prev == 'C';
}

您也可以将它们全部添加到堆栈中,然后pop()堆栈(所以char c = stack.pop(),反转逻辑),但这个特定表达式实际上没有必要。


编辑:添加了基于堆栈的变体:

public boolean isABC(String line) {
  // fill stack
  Stack<Character> stack = new Stack<Character>();
  for (int i=0; i<line.length(); i++) {
      stack.push(line[i]);
  }

  // reverse operations while popping from stack
  char prev = 'A';
  while ( ! stack.isEmpty()) {
      char c = stack.pop();
      switch (c) {
          case 'A': if (prev != 'B') return false; break;
          case 'B': if (prev != 'C') return false; break;
          case 'C': if (prev != 'A') return false; break;
      }
      prev = c;
  }
  return prev == 'A';
}

答案 1 :(得分:1)

如果字符串长度为2(&#34; AB&#34;),那么当你到达

if(line.charAt(i) =='C')

i的值为2。长度为2的字符串仅包含位置01的字符。如果你使用charAt(2),你试图超出字符串的结尾,导致异常。

现在,只要输入字符串长度不是3个字符的倍数,就会出现错误。

答案 2 :(得分:0)

我不打算纠正你的逻辑,但我会试着解释你为什么会得到SIOOB异常。请参阅内联评论。

让我们说吧 line =“AB”; 所以length = 2i = 0

while (i < line.length()){//this condition returns true.
        if(line.charAt(i) == 'A'){// you are trying to access 0th Element.
            L6Stack.push(ch);
            i++;// i is 1 now.
            if(line.charAt(i)=='B'){// trying to access 1st element.
                L6Stack.push(ch);
                i++;//i is 2 now.
                if(line.charAt(i) =='C'){// trying to access 2st element. which would give you exception because there is no 2nd element.
                    L6Stack.push(ch);
                    i++;
                }else
                    break;
            }else
                break;
        }else
            break;
    }