Gtown:
私はプログラムを作ったように{X +(Y - 2)×1}のように入力する方程式をユーザに尋ねるを扱っ+ [+のB]と確認する場合、すべての括弧やブラケットなどが閉じます。私の方法スポット場合、それは印刷する閉じること:式:{X +(Y - 2)×1} + [+のB] - >バランスされています。私の問題は、私の方法は、私は誰もがちょうど私の構文が間違っているなら、私に知らせてisBalanced method.Could以内にそのA問題があると思われるので、アンバランス毎回をデフォルトに思えるのですか?私がそれを読んだときにも流れているようです。ここに私のコードは次のとおりです。
import java.util.*;
import java.io.*;
public class BalancedParanthesis {
static String expressions[];
static class MyArrayStack{
int top = -1;
char brackets[] = new char[100];
void push(char x) {
if(top ==99) {
System.out.print("Stack full");
}
else {
brackets[++top] = x;
}
}
char pop() {
if(top ==-1) {
System.out.println("ERROR:Stack undeflow error");
return '\0';
}
else {
char element = brackets[top];
top--;
return element;
}
}
boolean isEmpty() {
return(top==-1)?true:false;
}
}
static boolean isMatchingPair(char bracketOne,char bracketTwo) {
if(bracketOne=='('&& bracketTwo ==')') {
return true;
}
else if(bracketOne == '{'&& bracketTwo == '}') {
return true;
}
else if(bracketOne == '['&& bracketTwo ==']') {
return true;
}
else {
return false;
}
}
static boolean isBalanced(String expression) {
MyArrayStack st =new MyArrayStack();
for(int index = 0; index<expression.length();index++) {
if(expression.charAt(index)=='{'|| expression.charAt(index)=='(' || expression.charAt(index)=='{') {
st.push(expression.charAt(index));
}
if(expression.charAt(index)=='}'|| expression.charAt(index)==')'||expression.charAt(index)=='}'){
if(st.isEmpty()) {
return false;
}
}
else if(!isMatchingPair(st.pop(),expression.charAt(index))) {
return false;
}
}
if(st.isEmpty()) {
return true;
}
else {
return false;
}
}
public static void main(String[] args) {
System.out.println("Input: ");
Scanner input = new Scanner(System.in);
String x = input.next();
if(isBalanced(x)) {
System.out.println("\n Expression: " + x + " is balanced");
}
else {
System.out.println("\n Expression: " + x + " is not balanced");
}
}
}
アンドレアス:
コメント内の論理上の欠陥を参照してください。
// why are we checking for `{` twice here?
if(expression.charAt(index)=='{'|| expression.charAt(index)=='(' || expression.charAt(index)=='{') {
st.push(expression.charAt(index));
} // missing 'else' here, maybe??
// why are we checking for `}` twice here?
if(expression.charAt(index)=='}'|| expression.charAt(index)==')'||expression.charAt(index)=='}'){
if(st.isEmpty()) {
return false;
}
// shouldn't we be calling pop() and isMatchingPair() here?
}
// here we know that charAt(index) is not a ')' or '}',
// so why are we calling pop() and isMatchingPair()?
else if(!isMatchingPair(st.pop(),expression.charAt(index))) {
return false;
}
// isEmpty() returns a boolean, so why not return it directly?
if(st.isEmpty()) {
return true;
}
else {
return false;
}
パフォーマンスを向上させるためと、コードの明瞭さ、だけ呼び出すexpression.charAt(index)
一度。
char ch = expression.charAt(index);
if (ch == '(' || ch == '{' || ch == '[') {
st.push(ch);
} else if (ch == ')' || ch == '}' || ch == ']'){
if (st.isEmpty()) {
return false;
}
if (! isMatchingPair(st.pop(), ch)) {
return false;
}
}
return st.isEmpty();