如何将堆栈传递给方法

时间:2012-10-25 05:32:24

标签: java stack rpn

我正在重建堆栈计算器,因此它是递归的。但是,我收到一个错误:

stacks2.java:29: illegal start of expression
public calculate(Stack<String> stack) {
^
stacks2.java:29: ';' expected
public calculate(Stack<String> stack) {

你如何正确地将堆栈传递给方法。

import java.util.*;

public class stacks2 {

public static void main (String []args){
System.out.printf("Enter a math equation in reverse polish notation:\n");

//Create stack of Strings
Stack<String> rpnStack = new Stack<String>();
//Create Scanner 
Scanner input = new Scanner(System.in);
//String in = input.next();

while(input != null) {
    String in = input.next();
        // Tokenize string based on spaces.
        StringTokenizer st = new StringTokenizer(in, " ", false);
            while (st.hasMoreTokens()) {
             rpnStack.push(st.nextToken());
         }
    //Send stack to Calculation Method
    calculate(rpnStack);
     }
}

public static void calculate(Stack<String> stack) {
    // Base case: stack is empty => Error, or finished
    if (!stack.isEmpty())
      // throw new StackUnderflowException("Empty Stack");

    // Base case: stack has 1 element, which is the answer => finished
    if (stack.size(1))
        System.out.printf("Finished, Answer: %f\n",stack.peek());

    // Recursive case: stack more elements on it.
    if (stack.size() > 1){
        String temp1 = stack.peek();
        stack.pop();
        String temp2 = stack.peek();
        stack.pop();
        String temp3 = stack.peek();
        stack.pop();


            if (temp3.equals("+")){
            float resultant = Float.parseFloat(temp1) + Float.parseFloat(temp2);
            stack.push(String.valueOf(resultant));
            //System.out.println(resultant);
            calculate(stack);
            }

            if (temp3.equals("-")){
            float resultant = Float.parseFloat(temp1) - Float.parseFloat(temp2);
            stack.push(String.valueOf(resultant)); 
            //System.out.println(resultant);
            calculate(stack);
            }

            else if (temp3.equals("*")){
            float resultant = Float.parseFloat(temp1) * Float.parseFloat(temp2);
            stack.push(String.valueOf(resultant)); 
            //System.out.println(resultant);
            calculate(stack);
            }

            else if (temp3.equals("/")){
            float resultant = Float.parseFloat(temp1) / Float.parseFloat(temp2);
            stack.push(String.valueOf(resultant)); 
            //System.out.println(resultant);
            calculate(stack);
            }

            else{
            System.out.printf("Something severely has gone wrong.");
            }
        }  
    }
}

代码的简要描述:我创建一个堆栈,通过字符串标记符填充用户输入。然后我想把它过去我的计算方法。它应该\应该在RPN中反复询问用户表达式,如果表达式有效则计算结果,否则宣布错误。要做到这一点,我相信我必须计算,如果RPN格式不正确,那么在计算过程中停止。我排在前三个字符串。临时三应该始终是一个操作员。如果不是,那么RPN格式不正确。如果代码为空,则程序抛出下溢异常。当有1个元素时,我将其返回给答案。我相信我的if语句是正确的。所以,是的,我想知道它是否有效,但是通过堆栈现在有点阻碍我。

2 个答案:

答案 0 :(得分:3)

您需要为您的方法提供return type。此外,由于您是通过main方法直接调用它,因此它应该是静态的。因此,将方法声明更改为: -

public static void calculate(Stack<String> stack)

此外,在main循环之后,您错过了while方法的结束括号。你需要在那里放一个额外的大括号。

P.S: Java中的类名应始终位于CamelCase中,每个单词的第一个字母应位于UpperCase中。此外,班级名称应始终为singular而不是plurals

所以,stacks2应该是Stack2,或者甚至更好,你可以命名为MyStack

您使用过: -

Float.parseFloat(temp2);// Convert temp2 into a float

没有任何L值。 Float.parseFloat返回原始浮点值。你需要把它存放在某个地方,否则没用。

所以,你应该替换以下代码: -

Float.parseFloat(temp2);
Float.parseFloat(temp1);
float resultant = temp1 * temp2;

: -

float resultant = Float.parseFloat(temp1) * Float.parseFloat(temp2);

答案 1 :(得分:2)

您需要放置主函数的结尾}。你误认为while循环的结束}