反向波兰表示法Java

时间:2012-12-31 10:42:45

标签: stack switch-statement case token rpn

我想制作反向波兰表示法算法,但我的代码不起作用。谁能解释我为什么? 在我的代码中,我想取字符,直到“/ + - *”代币。如果这个令牌是下一个,则进行操作,包含以防万一。

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的情况下编写它或者像那样。

输入:

2 2 + 2 / 2 /

输出:

(2+2) / 2 / 2

1 个答案:

答案 0 :(得分: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());
    }