Мой инфикс в постфикс Код не работает

Я попытался сделать свой инфикс для постфиксного кода, он работает без фигурных скобок, но когда я пытаюсь включить часть для учета фигурных скобок, происходит сбой, вот основная часть кода:

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());

Любая помощь будет оценена. Это ломается, когда дело доходит до скобки.

1 ответ

Вы можете получить некоторое представление о моей реализации программы Infix To Postfix, которая основана на стандартном алгоритме для таких преобразований. Вот:

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();
  }
}
Другие вопросы по тегам