1

算術式 (Ex. ((5-6)/(3+2)*34) ) の括弧のバランスが取れているかどうかをテストしていますが、右括弧と左括弧をチェックするループが等しく返されません。プロンプトが表示されたら、コンソールに「()」と入力するだけでテストしています。

for (int i = 0; i < formula.size(); i++)
  {
    char c = formula.pop();

    if (c == ')') {
        right++;
        break;
    } else if (c == '(') {
        left++;
        break;
    } else {
        break;
    }

  }// End for loop

  //System.out.println("There are " + left + " left parens, and " + right + " right parens.");

  if (right == left)
     System.out.println("The parentheses are balanced.");
  else
     System.out.println("The parentheses are NOT balanced.");

私の右と左の変数は 0 に初期化されており、得られる出力は右括弧が 1 つ、左括弧が 0 であることです。

何かご意見は?私が書いたとき、それは正しく聞こえました/正しく見えました。

更新: これは、if else の代わりに switch ケースを使用するように更新された私のコードです。それでも同じ出力が得られます..

for (int i = 0; i < formula.size(); i++)
  {
    char c = formula.pop();
     switch(c)
     {
        case ')':
           right++;
           break;   //Which breaks the switch, not the for
        case '(':
           left++;
           break;   //We don't need to do anything if it's neither.

     }// End switch      
  }// End for loop

更新#2:最近の変更を含むすべてのメインは次のとおりです。

public static void main(String[ ] args) {

  //variables
  String formulaString;
  Stack<Character> formula = new Stack<Character>();
  int right = 0;
  int left = 0;

  Scanner in = new Scanner(System.in);

  System.out.println("Welcome, enter a mathmatical formula and I will "
                    + "determine if the parentheses are balanced.\n");

  formulaString = in.next();

  for (int j = 0; j < formulaString.length(); j++) {

     formula.push(formulaString.charAt(j));

  }// End for loop

  System.out.println("Preview of the formula just entered: ");
  System.out.println(formula.display());

  System.out.println("The size of the stack is: " + formula.size());
  System.out.println("/******************************************");

  for (int i = 0; i <= formula.size(); i++)
  {
    char c = formula.pop();
    System.out.println(c);
    switch(c)
    {
       case ')':
         right++;
         break;   //Which breaks the switch, not the for
      case '(':
         left++;
         break;   //We don't need to do anything if it's neither.

     }// End switch      
  }// End for loop

  System.out.println("There are " + left + " left parens, and " + right + " right parens.");

  if (right == left)
     System.out.println("The parentheses are balanced.");
  else
     System.out.println("The parentheses are NOT balanced.");

}// End main.

私が今テストしている私の入力は(()). 私が得ている私の出力:

Preview of the formula just entered: 
[(, (, ), )]
The size of the stack is: 4
/******************************************
)
)
(
There are 1 left parens, and 2 right parens.
The parentheses are NOT balanced.
4

2 に答える 2

8

を使いたくない、使いbreakたいのですcontinueが、この場合はまったく必要ありません。ループを次のように変更します。

for (int i = 0; i < formula.size(); i++)
{
  char c = formula.pop();

  if (c == ')')
  {
    right++;
    continue; //You don't need to add this since nothing is being done after this point
  }
  else if (c == '(')
  {
    left++;
    continue; //You don't need to add this since nothing is being done after this point
  }
  //We don't need to do anything if it's neither
}

break次の項目に進む代わりに、for ループを終了します。したがって、ブラケットは 1 つしか見つかりませんでした。

更新: switchChris が尋ねたように、 -variant を使用する場所は次breakのようになります。

for (int i = 0; i < formula.size(); i++)
{
  char c = formula.pop();
  switch(c)
  {
    case '(':
      left++;
      break; //Which breaks the switch, not the for
    case ')':
      right++;
      break;
    //We don't need to do anything if it's neither. 
  }
}

更新 2for : -loop も間違っていることがわかりました。を使用しています: for (int i = 0; i < formula.size(); i++)。を使用しているため、ループを実行するたびにpop,が減少し、whileが増加します。したがって、ループがすぐに終了します。これを解決するには2つの方法があります。次のようにループを使用できます。formula.size()iwhile

while (formula.size() > 0)
...

forまたは、ループを次のように変更できます。

int formulasize = formula.size();
for (int i = 0; i < formulasize; i++)
...
于 2013-10-22T12:04:29.377 に答える
0

ループが不完全になる原因となるブレークを配置しました

if (c == ')') {
  right++;              
} else if (c == '(') {
  left++;               
}
于 2013-10-22T12:10:09.190 に答える