0

逆ポーランド記法アルゴリズムを作成したいのですが、コードが機能しません。誰かが私に理由を説明できますか? 私のコードでは、 "/+-*"tokens まで文字を取りたいと思います。このトークンが次の場合、大文字と小文字を含む操作を行います。

import java.util.Stack;
import java.util.StringTokenizer;

import javax.swing.JOptionPane;

public class ONP {

    public static void main(String[] args) {
        Stack<Double> stack = new Stack<Double>();
        double number1;
        double number2;

        String x = JOptionPane.showInputDialog("Tokens");
        StringTokenizer str = new StringTokenizer(x);

        while (str.hasMoreElements()) {
            str.nextElement();
            stack.push((Double) str.nextElement());

            for (int i = 0; i < x.length(); i++) {

                switch (x.charAt(i)) {
                case '+':
                    number1 = stack.pop();
                    number2 = stack.pop();
                    System.out.println(number1 + number2);
                    break;
                case '-':
                    number1 = stack.pop();
                    number2 = stack.pop();
                    System.out.println(number1 - number2);
                    break;
                case '/':
                    number1 = stack.pop();
                    number2 = stack.pop();
                    System.out.println(number1 / number2);
                    break;
                case '*':
                    number1 = stack.pop();
                    number2 = stack.pop();
                    System.out.println(number1 * number2);
                    break;
                }

            }
            System.out.println(stack.pop());
        }
    }

}

StringBuilder や sth などを使わずに書きたいと思います。

入力:

2 2 + 2 / 2 /

出力:

(2+2) / 2 / 2
4

1 に答える 1

3

これを試して

String s1;  



while (str.hasMoreElements()) 
{ 
     s1 = str.nextElement();

     if(s1.equals("+") || s1.equals("-") || s1.equals("*") || s1.equals("/"))
     {
          switch (s1) 
          {
                case '+':
                    number1 = stack.pop();
                    number2 = stack.pop();
                    System.out.print(number1 + " + " + number2);
                    break;
                case '-':
                    number1 = stack.pop();
                    number2 = stack.pop();
                    System.out.print(number1 +" - "+ number2);
                    break;
                case '/':
                    number1 = stack.pop();
                    number2 = stack.pop();
                    System.out.print(number1 +" / "+ number2);
                    break;
                case '*':
                    number1 = stack.pop();
                    number2 = stack.pop();
                    System.out.print(number1 +" * "+ number2);
                    break;
                }
         }
         else
         {
                 stack.push(s1);
         }

    }

それ以外の

 while (str.hasMoreElements()) {
        str.nextElement();
        stack.push((Double) str.nextElement());

        for (int i = 0; i < x.length(); i++) {

            switch (x.charAt(i)) {
            case '+':
                number1 = stack.pop();
                number2 = stack.pop();
                System.out.println(number1 + number2);
                break;
            case '-':
                number1 = stack.pop();
                number2 = stack.pop();
                System.out.println(number1 - number2);
                break;
            case '/':
                number1 = stack.pop();
                number2 = stack.pop();
                System.out.println(number1 / number2);
                break;
            case '*':
                number1 = stack.pop();
                number2 = stack.pop();
                System.out.println(number1 * number2);
                break;
            }

        }
        System.out.println(stack.pop());
    }
于 2012-12-31T11:08:35.290 に答える