2015-03-05 2 views
0

Я попытался оценить выражение, используя два стека (стеки операндов и стеки операторов). На данный момент я просто хочу проверить свою программу с помощью сложения и вычитания, но он возвращает 0, я думаю, что он не делал математику правильно. Пожалуйста, помогитеОценка выражения с использованием двух стеков

public static void main(String[] args) { 

    int userChoice; 
    String expression; 
    int finalresult; 

    Scanner keyboard = new Scanner(System.in); 
    System.out.println(" 1. Keyboard"); 
    System.out.println(" 2. From a file"); 
    System.out.println(); 
    System.out.print("Select (1), (2): "); 

    // Integer Stack that is used to store the integer operands 
    GenericStack<Integer> stackForOperands = new GenericStack<Integer>(); 
    // Character Stack that is used to store the operators 
    GenericStack<Character> stackForOperators = new GenericStack<Character>(); 

    userChoice = keyboard.nextInt(); 
    switch (userChoice) { 
    case 1: 
     System.out.print("Please enter an expression seperated by space: "); 
     keyboard.nextLine(); 
     expression = keyboard.nextLine(); 
     String[] tokens = expression.split("\\s+"); 
     for (int i = 0; i < tokens.length; i++) { 
      if (tokens[i].matches("-?\\d+")) { 
       stackForOperands.push(Integer.parseInt(tokens[i])); 
      } else { 
       if (tokens[i] == "+" || tokens[i] == "-") {// if the extracted item is a + or – operator                                                     
        if (stackForOperators.isEmpty()) 
         stackForOperators.push(tokens[i].charAt(0)); 
        else { 
         if (tokens[i] == "*" || tokens[i] == "/") 
          stackForOperators.push(tokens[i].charAt(0)); 
         //else 
          // int top = stackForOperators.getTop(); 
          // while (top != -1) { 
          //oneOperatorProcess(stackForOperands, stackForOperators); 
         // top = top - 1; 
         // } 
        } 
       }// end of checking "+", "-" 
      } 
     } 
     oneOperatorProcess(stackForOperands, stackForOperators); 
     finalresult = stackForOperands.pop(); 
     System.out.println(finalresult); 
    } 
} 

Моего метода для выполнения операции

public static void oneOperatorProcess(GenericStack val, GenericStack op) { 
    char operator = (char) op.getTop(); 
    int a = (int) val.pop(); 
    int b = (int) val.pop(); 
    int result = 0; 
    switch (operator) { 
    case '+': 
     result = a + b; 
     break; 
    case '-': 
     result = a - b; 
     break; 
    case '*': 
     result = a * b; 
     break; 
    case '/': 
     result = a/b; 
     break; 
    default: 
     //return 0; 
    } 
    val.push((int) result); 
    //return result; 
+0

Что такое 'GenericStack'? – weston

+0

И что вы вводите в качестве тестового ввода? – weston

+0

Well GenericStack - это в основном стек, который принимает любые типы данных. Я использовал простое выражение типа 5 + 3, но оно не будет работать ни на что похоже. –

ответ

0

Вашей логики немного перепутались. Например:

if (tokens[i] == "+" || tokens[i] == "-") {// if the extracted item is a + or – operator                                                     
    if (stackForOperators.isEmpty()) 
     stackForOperators.push(tokens[i].charAt(0)); 
    else { 
     //this will always eval to false because you can only get here if tokens[i] is + or - 
     if (tokens[i] == "*" || tokens[i] == "/") 
      stackForOperators.push(tokens[i].charAt(0)); 
    } 
} 

Кроме того, как @BartKiers отметил в своем комментарии, делать tokens[i].equals(...) сравнить свои строки.

1

Запуск приложения. Введите некоторые вещи. Проверьте результат. Повторение.

Это очень медленный способ развития! Это также трудно сделать, поскольку количество тестовых случаев становится больше, и вы не будете знать, не сломал ли вы ранее рабочий случай, если вы вручную не будете пытаться все, каждый раз.

Модульное тестирование на помощь

Вы должны смотреть в модульное тестирование, здесь я использовал JUnit добавить тесты по одному за раз, чтобы постепенно наращивать полный Жгут тест, который безболезненно для запуска. Прочтите на TDD для получения дополнительной информации.

import static org.junit.Assert.*;  
import org.junit.Test; 

public class ExpressionTests { 

    @Test 
    public void oneNumber() { 
     assertEquals(123, new ExpressionEval().evaluate("123")); 
    } 

    @Test 
    public void addTwoNumbers() { 
     assertEquals(3, new ExpressionEval().evaluate("1 + 2")); 
    } 

    @Test 
    public void subtractTwoNumbers() { 
     assertEquals(2, new ExpressionEval().evaluate("5 - 3")); 
    } 

    @Test 
    public void addThreeNumbers() { 
     assertEquals(8, new ExpressionEval().evaluate("1 + 2 + 5")); 
    } 
} 

Класс начинает выглядеть следующим образом:

Вы имели ряд или ошибки как == для сравнения строк. См. How do I compare strings in Java?

Также нет петли while, означающей, что вы справитесь только с одной простой суммой и вообще не сможете управлять никаким оператором.

private class ExpressionEval { 

    private final Stack<Integer> stackForOperands = new Stack<Integer>(); 
    private final Stack<Character> stackForOperators = new Stack<Character>(); 

    public int evaluate(String expression) { 
     String[] tokens = expression.split("\\s+"); 
     for (String token : tokens) { 
      if (token.matches("-?\\d+")) { 
       stackForOperands.push(Integer.parseInt(token)); 
      } else { 
       if ("+".equals(token) || "-".equals(token)) { 
        stackForOperators.push(token.charAt(0)); 
       } 
      } 
     } 
     while (!stackForOperators.isEmpty()) 
      oneOperatorProcess(); 
     return stackForOperands.pop(); 
    } 

    private void oneOperatorProcess() { 
     char operator = stackForOperators.pop(); 
     int b = stackForOperands.pop(); 
     int a = stackForOperands.pop(); 
     int result = 0; 
     switch (operator) { 
     case '+': 
      result = a + b; 
      break; 
     case '-': 
      result = a - b; 
      break; 
      //Add others only when you have a test case that needs it. 
     } 
     stackForOperands.push(result); 
    } 

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