波兰表示法实施

时间:2016-12-18 20:04:06

标签: java

我想编写一个程序来计算给定算术表达式的输出。像那样:

我的输入是:* + * + 1 2 + 3 4 5 6 我的输出应该是:156

我使用Stack数据类型编写了一个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这样的东西,我的编译器就会出现这样的错误:

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行代码:

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

我无法弄清楚代码中的问题。我是Java的新手。请帮我。非常感谢:)

3 个答案:

答案 0 :(得分:1)

您的代码为您提供错误,因为您从左到右进行解析。所以它得到的第一个字符串是&#34; *&#34; - 明星。因此,它检查它是否为星形,并从堆栈中弹出。但是,堆栈是空的!因此,您应该从右向左遍历,当您发现数字推入堆栈时,当您找到运算符时,请执行操作

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
    .
    .
}

答案 1 :(得分:1)

上述问题的替代解决方案..

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

public class Expression
{
   static int i = 0 ;
   static Stack stack = new Stack<>();
   public static void main(String[] args) {

    Scanner in = new Scanner(System.in);
    String input = in.next();
    input += in.nextLine();
    char expr[] = input.toCharArray();

    for(int j = expr.length-1 ; j>=0 ; j--)
    {
        stack.push(process(expr[j]));
    }
    System.out.println("Result is : " + stack.pop());
}
public static int process(char val)
{
    int res = val;
    int flag = 0;
    if(val == '+')
    {
        flag = 1 ;
        res = (Integer)stack.pop() + (Integer)stack.pop();
    }
    else if(val == '-')
    {
        flag =1 ;
        res = (Integer)stack.pop() - (Integer)stack.pop();
    }
    else if(val == '*')
    {
        flag =1 ;
        res = (Integer)stack.pop() * (Integer)stack.pop();
    }
    else if(val == '/')
    {
        flag =1 ;
        res = ((Integer)stack.pop() / (Integer)stack.pop());
    }

    if(flag == 1)
        return res;
    else
        return res-48;
}
public static void print()
{
    int k = i;
    while(--k >= 0)
    {
        System.out.print(stack.peek() + " : ");
    }
    System.out.println("\n");
}
}

答案 2 :(得分:0)

更新回答

你不应该将所有操作符都推入堆栈,并在看到两个操作数后弹出它吗? (当一个位于堆栈顶部时,您将有两个操作数,另一个只是进入,即$this->database = $database;)。