2013-04-23 48 views
-1

我想检查一个字符串是否是回文,但它似乎不起作用,因为当我发送一个我知道不是回文的字符串时,它会返回这是一个回文,任何人都可以帮忙吗?它也不会添加到变量计数器代码不能按预期工作(回文检查器)

package UnaryStack.RubCol1183; 

public class CheckPalindrome { 

static int counter = 0; 

/** Decides whether the parentheses, brackets, and braces 
in a string occur in left/right pairs. 
@param expression a string to be checked 
@return true if the delimiters are paired correctly */ 
public static boolean checkBalance(String expression) 
{ 
    StackInterface<Character> temporaryStack = new LinkedStack<Character>(); 
    StackInterface<Character> reverseStack = new LinkedStack<Character>(); 
    StackInterface<Character> originalStack = new LinkedStack<Character>(); 


    int characterCount = expression.length(); 
    boolean isBalanced = true; 
    int index = 0; 
    char nextCharacter = ' '; 


    for (;(index < characterCount); index++) 
    { 
     nextCharacter = expression.charAt(index); 
     switch (nextCharacter) 
     { 
     case '.': case '?': case '!': case '\'': case ' ': case ',': 
      break; 
     default: 
     { 
      { 
       reverseStack.push(nextCharacter); 
       temporaryStack.push(nextCharacter); 
       originalStack.push(temporaryStack.pop()); 
      } 

      { 
       char letter1 = Character.toLowerCase(originalStack.pop()); 
       char letter2 = Character.toLowerCase(reverseStack.pop()); 
       isBalanced = isPaired(letter1, letter2); 
       if(isBalanced == false){ 
        counter++; 
       } 
      } 

      break; 
     } 
     } // end switch 
    } // end for 
    return isBalanced; 
} // end checkBalance 

// Returns true if the given characters, open and close, form a pair 
// of parentheses, brackets, or braces. 
private static boolean isPaired(char open, char close) 
{ 
    return (open == close); 
} // end isPaired 

public static int counter(){ 
    return counter; 
} 


}//end class 

回答

0

我发现了在checkBalace()方法内部发现的逻辑错误,并将代码完成了一个完整的工作。下面是我完成的代码如下所示:

public class CheckPalindrome { 

static int counter; 

/** Decides whether the parentheses, brackets, and braces 
in a string occur in left/right pairs. 
@param expression a string to be checked 
@return true if the delimiters are paired correctly */ 
public static boolean checkBalance(String expression) 
{ 
    counter = 0; 
    StackInterface<Character> temporaryStack = new LinkedStack<Character>(); 
    StackInterface<Character> reverseStack = new LinkedStack<Character>(); 
    StackInterface<Character> originalStack = new LinkedStack<Character>(); 

    boolean isBalanced = true; 

    int characterCount = expression.length(); 

    int index = 0; 
    char nextCharacter = ' '; 


    for (;(index < characterCount); index++) 
    { 
     nextCharacter = expression.charAt(index); 
     switch (nextCharacter) 
     { 
     case '.': case '?': case '!': case '\'': case ' ': case ',': 
      break; 
     default: 
     { 
      { 
       reverseStack.push(nextCharacter); 
       temporaryStack.push(nextCharacter); 

      } 

      break; 
     } 
     } // end switch 


} // end for 

while(!temporaryStack.isEmpty()){ 
    originalStack.push(temporaryStack.pop()); 
} 

while(!originalStack.isEmpty()){ 
    char letter1 = Character.toLowerCase(originalStack.pop()); 
    char letter2 = Character.toLowerCase(reverseStack.pop()); 
    isBalanced = isPaired(letter1, letter2); 
    if(isBalanced == false){ 
     counter++; 
    } 
} 


    return isBalanced; 
} // end checkBalance 

// Returns true if the given characters, open and close, form a pair 
// of parentheses, brackets, or braces. 
private static boolean isPaired(char open, char close) 
{ 
    return (open == close); 
} // end isPaired 

public static int counter(){ 
    return counter; 
} 


} 

我用了2而之外方法从而固定逻辑错误指出。我还分配了值0到的计数器里面的方法来修复我遇到的一个小问题。如果我仍然有错误,请随时修改代码,但我认为我没有犯错,然后我又是一个初学者。

0

你把exaclty在reverseStack和originalStack相同elemets,因为你推入temporaryStack一切都将被立即推入originalStack。这根本不符合逻辑。

reverseStack.push(nextCharacter); 
temporaryStack.push(nextCharacter); 
originalStack.push(temporaryStack.pop()); 

因此表达

isBalanced = isPaired(letter1, letter2); 

将始终返回true。

1

你的实现似乎比它需要的复杂得多。

//Check for invalid characters first if needed. 
StackInterface<Character> stack = new LinkedStack<Character>(); 

for (char ch: expression.toCharArray()) { 
    Character curr = new Character(ch); 
    Character peek = (Character)(stack.peek()); 
    if(!stack.isEmpty() && peek.equals(curr)) { 
     stack.pop(); 
    } else { 
     stack.push(curr) 
    } 
} 
return stack.isEmpty(); 

老实说使用堆栈在这里杀。我会用下面的方法。

int i = 0; 
int j = expression.length() - 1; 
while(j > i) { 
    if(expression.charAt(i++) != expression.charAt(j--)) return false; 
} 
return true;