2017-03-26 21 views
0

これは私が教科書から得たコードです。電卓は後置記法として入力された式を解決しています。プログラムが式を評価すると、スタックの代わりにスタックを使用し続けることができる方法があるかどうか疑問に思っていました。スタックを使用したRPN電卓

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

    public class RPN2 
    { 
    private Stack<Integer> stack; 

    public RPN2() 
     { 
      stack = new Stack<Integer>(); //creates stack 
     } 

    public static void main(String[] args) 
     { 
      String expression, again; 
      int result; 

      Scanner keyboard = new Scanner(System.in); 

      do 
      { 
       RPN2 evaluator = new RPN2(); 
       System.out.println("Enter a valid post-fix expression one token " + 
            "at a time with a space between each token (e.g. 5 4 + 3 2 1 - + *)"); 
       System.out.println("Each token must be an integer or an operator (+,-,*,/)"); 
       expression = keyboard.nextLine(); 

       result = evaluator.evaluate(expression); 
       System.out.println(); 
       System.out.println("That expression equals " + result); 

       System.out.print("Evaluate another expression [Y/N]? "); 
       again = keyboard.nextLine(); 
       System.out.println(); 
      } 
      while (again.equalsIgnoreCase("y")); 
     } 

    public int evaluate(String expr) 
     { 
      int op1, op2, result = 0; 
      String token; 
      Scanner parser = new Scanner(expr);  

      while (parser.hasNext())   
      { 
       token = parser.next();   

       if (isOperator(token)) //if operator pop 
       { 
        op2 = (stack.pop()).intValue(); 
        op1 = (stack.pop()).intValue(); 
        result = evaluateSingleOperator(token.charAt(0), op1, op2);  // 
        stack.push(new Integer(result)); 
       } 
       else 
        stack.push(new Integer(Integer.parseInt(token)));  
      } 

      return result; 
     } 

    private boolean isOperator(String token) 
     { 
      return (token.equals("+") || token.equals("-") || 
        token.equals("*") || token.equals("/") || token.equals("%")); 

     } 

    private int evaluateSingleOperator(char operation, int op1, int op2) 
     { 
      int result = 0; 

      switch (operation) 
      { 
       case '+': 
        result = op1 + op2; 
        break; 
       case '-': 
        result = op1 - op2; 
        break; 
       case '*': 
        result = op1 * op2; 
        break; 
       case '/': 
        result = op1/op2; 
        break; 
       case '%': 
        result = op1 % op2; 
        break; 
      } 

      return result; 
     } 

} 
+0

あなたが行を移動してみました 'RPN2評価=新しいRPN2();' do'が始まる前に、 '3行まで、だから、ですか? –

答えて

0

はいあなたは、見ることができますコメント:

public RPN2() { 
    stack = new Stack<>(); //creates stack 
} 

void clearStack(){ //add clear stach method 
    stack.clear(); 
} 

public static void main(String[] args) 
{ 
    String expression, again; 
    int result; 

    Scanner keyboard = new Scanner(System.in); 
    RPN2 evaluator = new RPN2(); //move out of the do loop 

    do 
    { 
     evaluator.clearStack();//use clear stack method 
     //rest of the code omitted (no change in it)