Java 我的中缀到后缀代码不起作用

Java 我的中缀到后缀代码不起作用,java,stack,postfix-notation,infix-operator,Java,Stack,Postfix Notation,Infix Operator,我尝试编写中缀到后缀的代码,它在没有大括号的情况下工作,但当我尝试包含大括号部分时,它崩溃了,代码的主要部分如下: for (i=0; i<characters.length; i++) { if (characters[i]=='*' || characters[i]=='/' || characters[i]=='+' || characters[i]=='-' || characters[i]=='(' || characters[i]==')'){ if (

我尝试编写中缀到后缀的代码,它在没有大括号的情况下工作,但当我尝试包含大括号部分时,它崩溃了,代码的主要部分如下:

for (i=0; i<characters.length; i++)
{
    if (characters[i]=='*' || characters[i]=='/' || characters[i]=='+' || characters[i]=='-' || characters[i]=='(' || characters[i]==')'){
        if (postfix.empty() && characters[i]!=')')
            postfix.push(characters[i]);
        else if (!postfix.empty()){
            if (characters[i]=='(')
                postfix.push(characters[i]);
            if (characters[i]=='*' || characters[i]=='/')
                priority2=1;
            if (characters[i]=='+' || characters[i]=='-')
                priority2=0;
            if (characters[i]==')'){
                while (postfix.peek()!='(') //loop until we see the closing bracket
                    System.out.print(postfix.pop()); //pop everything till we see the closing bracket
                postfix.pop(); //to pop the bracket
            }
            if (!postfix.empty())
                peeked=postfix.peek();
            if (peeked=='*' || peeked=='/')
                priority=1;
            if (peeked=='+' || peeked=='-')
                priority=0;
            if (priority2>priority)
                postfix.push(characters[i]);
            else{
                while (!postfix.empty())
                    System.out.print(postfix.pop());
                postfix.push(characters[i]);
            }       
        }
    }
    else 
        System.out.print(characters[i]);    
}
while (!postfix.empty())
    System.out.print(postfix.pop());

任何帮助都将不胜感激。当谈到大括号时,它会断裂。

您可以从我的中缀到后缀程序的实现中获得一些见解,该程序基于进行此类转换的标准算法。这是:

import java.util.Scanner;
import java.util.Stack;

public class InfixPostfix
{
  private Stack<Character> stack;
  private StringBuilder postfixExpression;

  public InfixPostfix()
  {
    stack = new Stack<>();
    postfixExpression = new StringBuilder();

    String infix = getInfixExpression();

    if (isValidInfix(infix))
    {
      System.out.println(convertToPostfix(infix));
    }
    else
    {
      System.out.println("Invalid Expression");
    }
  }

  private boolean isValidInfix(String infix)
  {
    int parenthesisCounter = 0;
    for (int i = 0; i < infix.length(); i++)
    {
      char ch = infix.charAt(i);
      if (ch == '(')
        parenthesisCounter++;
      else if (ch == ')')
        parenthesisCounter--;

      if (parenthesisCounter < 0)
        return false;
    }
    if (parenthesisCounter == 0)
      return true;
    return false;
  }

  private String convertToPostfix(String infix)
  {
    for (int i = 0; i < infix.length(); i++)
    {
      char ch = infix.charAt(i);

      switch (ch)
      {
        case '+':
        case '-':
          processOperatorOfPrecedence(ch, 1);
          break;
        case '*':
        case '/':
          processOperatorOfPrecedence(ch, 2);
          break;
        case '(':
          stack.push(ch);
          break;
        case ')':
          processParenthesis(ch);
          break;
        default:
          postfixExpression.append(ch);
          break;
      }
    }

    while (!stack.isEmpty())
    {
      postfixExpression.append(stack.pop());
    }

    return postfixExpression.toString();
  }

  private void processOperatorOfPrecedence(char operator, int precedence)
  {
    while (!stack.isEmpty())
    {
      char topOperator = stack.pop();

      if (topOperator == '(')
      {
        stack.push(topOperator);
        break;
      }
      else
      {
        int operatorPrecedence;

        if (topOperator == '+' || topOperator == '-')
          operatorPrecedence = 1;
        else
          operatorPrecedence = 2;

        if (operatorPrecedence < precedence)
        {
          stack.push(topOperator);
          break;
        }
        else
          postfixExpression.append(topOperator);
      }
    }
    stack.push(operator);
  }

  private void processParenthesis(char ch)
  {
    while (!stack.isEmpty())
    {
      char character = stack.pop();

      if (character == '(')
        break;
      else
        postfixExpression.append(character);
    }
  }

  private String getInfixExpression()
  {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Enter an infix math expression: ");
    String input = scanner.nextLine();
    scanner.close();
    return input;
  }

  public static void main(String[] args)
  {
    new InfixPostfix();
  }
}

你真的应该调试你自己的代码。我试过。。我经历了很多次。。我不明白为什么它仍然会打印大括号,即使我在打印大括号之前弹出大括号下载并使用调试器。代码没有错误。。程序员必须能够调试自己的bug。当你要工作的时候,你怎么能发布你所有的代码,然后问嘿,我的代码中有什么错误。只要想一想bug可能来自何处,并在它出现之前将其打破。另外,为什么不使用switch case呢?您不需要扫描它两次,一次用于建立有效性,另一次用于解析它。您可以同时执行这两项操作,“标准算法”,即Dijkstra调车场算法,也可以执行这两项操作。