2016-09-20 9 views
1

Я использую стек для создания постфиксного калькулятора в java. У меня есть основная часть, написанная, но я сталкиваюсь с некоторыми проблемами. Для начала я должен учитывать пробелы, и я не уверен, как это сделать с моей текущей настройкой. Я не уверен, что это полностью исправит программу, но это будет началом. Любая помощь будет принята с благодарностью.Ошибка Java Postfix Calculator

import java.util.Scanner; 
import java.util.Stack; 
public class Postfix 
{ 
public static void main(String[]args) 
{ 
    Scanner sc = new Scanner(System.in); 
    System.out.println("Enter a Postfix expression"); 
    String input = sc.nextLine(); 
    Stack<Integer> Pstack = new Stack<Integer>(); 
    int result = 0; 
    for(int i=0; i<input.length();i++) 
    { 
     char ch = input.charAt(i); 

     if(ch>='0' && ch<='9') 
     { 
      Pstack.push((int)(ch-'0')); 
     } 
     else 
     { 
      int o1 = Pstack.pop(); 
      int o2 = Pstack.pop(); 

      switch(ch) 
      { 
      case '+':result=o1+o2; 
      break; 
      case '-':result=o1-o2; 
      break; 
      case '/':result=o1/o2; 
      break; 
      case '*':result=o1*o2; 
      } 
     } 
     Pstack.push(result); 
    } 
    result = Pstack.pop(); 
    System.out.println("result: "+ result); 
    } 
} 
+0

Пут: 'если (ч == '«) продолжаются, '' непосредственно после полукокса ч = input.charAt (I); ' , –

ответ

2

Как уже упоминалось в комментариях, положить

if(ch == ' ') continue; 

непосредственно после

char ch = input.charAt(i); 

Это позволит устранить проблему с пробелами.

Другая проблема заключается в том, что

Pstack.push(result); 

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

Таким образом, это утверждение должно быть последним в случае «else».

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

например. если у вас есть постфиксное выражение 12- (которое должно оцениваться в -1), 2 находится поверх стека, а 1 - после. В текущем решении результат будет равен 2 -1, поскольку аргументы будут получены в неправильном порядке.

Так

int o1 = Pstack.pop(); 
int o2 = Pstack.pop(); 

должны быть исправлены в

int o2 = Pstack.pop(); 
int o1 = Pstack.pop(); 
+0

Спасибо! Это исправило это. Также помог мне понять это немного лучше. Отличный ответ! –

+0

Посмотрев еще раз на мою программу, у меня возникает еще один вопрос. Я просто понял, что мой калькулятор работает только для чисел до 10. Например, 1 2 + работает и равен 3. Однако 1 11 + doesnt и он равен 2 вместо. Есть ли способ исправить это? –

+0

, в этом случае нужно было бы изменить формат постфиксной строки, добавив разделитель, разделяющий аргументы/операторы. В противном случае 111- можно было бы интерпретировать как 11 1 -, так и 1 11 -. Затем можно использовать другой сканер над параметром ввода и получить с ним аргументы/операторы. – Gernot

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

  • Нет связанных вопросов^_^