2016-12-18 7 views
2

算術式を指定して出力を計算するプログラムを作成します。そのような:ポーランド語表記の実装

私の入力は次のとおりです。* + * + 1 2 + 3 4 5 6 私の出力は次のようになります。

156私はこの使用してスタックデータ型を実行するJavaプログラムを書きました。 私のJavaプログラムは次のとおりです。

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


public class Main { 
    public static void main(String args[]){ 
     Stack stack =new Stack(); 

     String input; 

     String trimmedInput[]; 
     int output; 
     int number1,number2; 
     int countOfNumber,j; 

     Scanner scanner = new Scanner(System.in); 

     System.out.println("put your arithmetical expression. Using Space between "); 
     input=scanner.nextLine(); 

     trimmedInput=input.split("\\s+"); 

//  for(String a:trimmedInput) 
//   System.out.println(a); 


     countOfNumber=trimmedInput.length; 


     for(j=0;j<countOfNumber;j++) { 

       if (isNumeric(trimmedInput[j])) { 
        stack.push(trimmedInput[j]); 

       } 
       if (trimmedInput[j].equals("+")) { 
        number1 = Integer.parseInt((String) stack.pop()) ; 

        number2 = Integer.parseInt((String) stack.pop()) ; 

        output = number1 + number2; 

        stack.push(output); 

       } 

       if(trimmedInput[j].equals("-")){ 
        number1 = Integer.parseInt((String) stack.pop()) ; 

        number2 = Integer.parseInt((String) stack.pop()) ; 

        output = number1-number2; 

        stack.push(output); 
       } 
       if(trimmedInput[j].equals("*")){ 
        number1 = Integer.parseInt((String) stack.pop()) ; 

        number2 = Integer.parseInt((String) stack.pop()) ; 

        output = number1*number2; 

        stack.push(output); 
       } 
       if(trimmedInput[j].equals("/")){ 
        number1 = Integer.parseInt((String) stack.pop()) ; 

        number2 = Integer.parseInt((String) stack.pop()) ; 

        output = number1/number2; 

        stack.push(output); 
       } 

      } 

     while(!stack.isEmpty()) 
      System.out.println(stack.pop()); 


    } 
    public static boolean isNumeric(String str) 
    { 
     try 
     { 
      double d = Double.parseDouble(str); 
     } 
     catch(NumberFormatException nfe) 
     { 
      return false; 
     } 
     return true; 
    } 

} 

ここに私の問題があります。私はそのような* + * + 1 2 + 3 4 5 6何かを計算したい場合は、私のコンパイラは、そのようなエラーを与える:私は問題が私の中にあるものを考え出したことはできません

number1 = Integer.parseInt((String) stack.pop()) ; 

:ここ

Exception in thread "main" java.util.EmptyStackException  
at java.util.Stack.peek(Stack.java:102)  
at java.util.Stack.pop(Stack.java:84) 
at Main.main(Main.java:41) 

は私の41行のコードでありますコード。私はJavaで新しいです。私を助けてください。どうもありがとう:)

+1

これは、スタックから要素を取り除こうとしていることを意味します。それは空です! –

+2

右から左へ移動する必要があります。接頭辞評価のこの例を見てください:http://www.manojagarwal.co.in/evaluation-of-prefix-expression/ – rafid059

+0

はい私の友人。私はそれを知っているが、私のコードがこのエラーを与えることは理解できない。私は私のコードで私のスタックをプッシュしています。 – cilgin282

答えて

1

左から右に解析しているため、コードでエラーが発生しています。最初の文字列は "*" - 星です。それで、それは星であることをチェックし、スタックからポップします。しかし、スタックは空です!したがって、右から左に移動し、数字の押し込みがスタックに入るのを見つけたら、演算子を見つけたら

for (int i = trimmedInput.length-1; i >= 0; i--) { 
    if (isNumeric(trimmedInput[i])) stack.push(trimmedInput[i]); 

    else if (trimmedInput[i].equals("*")) { 
     // here you might get StackEmptyException if your expression is invalid 
     // if you want to avoid that, then use try-catch and throw your custom InvalidExpressionExceptiono 
     number1 = Integer.parseInt((String)stack.pop()); 
     number2 = Integer.parseInt((String)stack.pop()); 
     output = number1*number2; 
     stack.push(output); 
    } 
    . 
    . 
    . // do the same for other operators 
    . 
    . 
} 
0

更新答え

あなたはスタックにすべての演算子をプッシュすると、あなたは2つのオペランドを見た後にそれを飛び出さないでしょうか? (スタックの先頭に2つのオペランドがあり、もう1つはtrimmedInput[j]になります)。

+0

**は最初のtrimmedInput [0]を*と見て、スタックにプッシュします** 。これは決して起こらない。なぜなら、最初の星(*)は決して積み重ねられないからだ。 OPのif-conditionを確認してください。最初の人は、文字列が数字かどうかをチェックします。プログラムが2つの数字をポップしようとし、スタックに何もないので、例外が発生しています。このプログラムでは、演算子はスタックにプッシュ**されません。理由はありません。 – rafid059

+0

あなたは正しいです。私は頭の中の論理に従っていたので、間違ってしまった。私は上記の私の答えを更新しました。混乱させて申し訳ありません。 – leeyuiwah

+0

それはどちらもうまくいかないでしょう。 OPの例をトレースして、プレフィックスを評価する唯一の方法は、右から左に横断することです。また、演算子をスタックにプッシュしないでください。 [接頭辞評価](https://en.wikipedia.org/wiki/Polish_notation)を見てください:) – rafid059

関連する問題