2012-02-28 3 views
0

Я должен написать программу для преобразования нотации infix в постфиксную нотацию с использованием стеков в Java. Я в значительной степени сделал, но я получаю сообщение об ошибке. Вот код, как сейчас:Конвертировать инфикс в postix и оценивать выражение в Java

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

public class InfixToPostfix { 
    private String infix; 
    private String postfix = ""; 

    public void convertString (String a){ 
    String str = ""; 
    infix = a; 
    Stack<String> stack = new Stack<String>(); 

    for (int i = 0; i < infix.length(); i++){ 
     str = infix.substring(i,i+1); 
     if(str.matches("[a-zA-Z]|\\d")) 
     postfix += str; 
     else if (isOperator(str)){ 
     if (stack.isEmpty()){ 
      stack.push(str); 
     } 
     else{ 
      String stackTop = stack.peek(); 
      while (getPrecedence(stackTop,str).equals(stackTop) 
       && !(stack.isEmpty())){ 
      postfix += stack.pop(); 
      if (!(stack.isEmpty())) 
       stackTop = stack.peek(); 
      } 
      stack.push(str); 
     } 
     } 
    } 
    while(!(stack.isEmpty())) 
     postfix += stack.pop(); 
    System.out.println("The postfix form of the expression you entered is: " + 
         postfix); 
    } 

    private boolean isOperator(String ch){ 
    String operators = "*/%+-"; 
    if (operators.indexOf(ch) != -1) 
     return true; 
    else 
     return false; 
    } 

    private String getPrecedence(String op1, String op2){ 
    String multiplicativeOps = "*/%"; 
    String additiveOps = "+-"; 
    if ((multiplicativeOps.indexOf(op1) != -1) && (additiveOps.indexOf(op2) != -1)) 
     return op1; 
    else if ((multiplicativeOps.indexOf(op2) != -1) && (additiveOps.indexOf(op1) != 
                 -1)) 
     return op2; 
    else if((multiplicativeOps.indexOf(op1) != -1) && (multiplicativeOps.indexOf 
                 (op2) != -1)) 
     return op1; 
    else 
     return op1; 
    } 
    public static void main(String[] args) { 

    System.out.println("Enter an expression in the Infix form:"); 
    Scanner scanner = new Scanner(System.in); 

    String expression = scanner.nextLine(); 
    new convertString (expression); 

    } 
} 

Ошибка находится на последней строке и говорит:

«Исключение в потоке„главный“java.lang.Error: Нерешенные проблемы компиляции: convertString не может быть разрешен к типу

at InfixToPostfix.main(InfixToPostfix.java:62)" 

Любые идеи о том, как исправить это, что я делаю неправильно

EDIT:? Я получил мой код работает, и это Succ эссенциально конвертируя инфикс в постфикс, но есть ли способ заставить его также оценить выражение и выплюнуть ответ? Например, если вход был 2 + 3, тогда он преобразует его в 23+, а затем выплюнет 5.

+1

Подсказка: проверить линию 62. – kechapito

+0

Я знаю, где ошибка, я просто не знаю, как это исправить. – Brett

+0

Я редактировал свой вопрос в нижней части сообщения. – Brett

ответ

2

Вы не предоставляете конструктор, который принимает строку.

Что вы должны сделать данный код, который вы написали, это

new InfixToPostfix().convertString(expression); 
+0

Исправлена ​​ошибка, и она отлично работает. Благодаря! – Brett

+0

Я редактировал свой вопрос в нижней части сообщения. – Brett

3

Вы делаете new InfixToPostfix (expression), но для этого требуется вызвать конструктор, который принимает аргумент String. Но вы не создали такого конструктора.

+0

Я имел в виду, что он говорит «convertString (выражение)», но я все еще получаю сообщение об ошибке, но на этот раз он говорит, что convertString не может быть разрешен для типа. – Brett

+0

убедитесь, что вы вызываете convertString (выражение) экземпляром InfixToPostfix –

+0

Я редактировал свой вопрос в нижней части сообщения. – Brett

2

Вы пытаетесь использовать конструктор, который вы никогда не создать в своем классе InfixToPostfix. То, что вы пытаетесь использовать, - это метод convertString(String). Есть два способа исправить эту проблему ...

Вы можете создать конструктор с строковым аргументом и просто вызвать метод в конструкторе:

public InfixToPostfix(String a) { 
    convertString(a); 
} 

Или вызовите функцию convertString из основного метода с экземпляр InfixToPostfix:

InfixToPostfix ip = new InfixToPostfix(); 
ip.convertString(expression); 
+0

Я редактировал свой вопрос в нижней части сообщения. – Brett

1

Вам необходимо предоставить конструктор, который принимает аргумент String. Посмотрите, как:

public InfixToPostfix(String infix) {

this.infix = infix;

}

Смежные вопросы