无法从Java中的命令行参数将值推入堆栈

时间:2012-09-11 05:39:30

标签: java math main evaluate infix-notation

我在java中有一个奇怪的问题。我正在尝试制作一个数学表达式计算器,它将评估中缀数学表达式并在屏幕上返回最终结果。我已经使用堆栈来完成任务,到目前为止,我使用硬编码字符串进行输入,但后来我将其更改为命令行参数以实现相同目的。我的问题是,我正在使用的堆栈不会从命令行输入将值推入自身,尽管数据类型和字符串完全相同。

以下是将数据推入堆栈的代码。

public class Expression 
{
    public static void main(String argv[]){

        Stack<String> operator = new Stack<String>();
        Stack<String> operand = new Stack<String>();

        /*
        String push[] = new String[argv.length];
        for (int i = 0; i<push.length; i++){
            push[i] = argv[i];
        }
        */

        for(int i = 0; i<argv.length; i++){
            if(argv[i] == "+" || argv[i] == "-" || argv[i] == "*" 
               || argv[i] == "/" || argv[i] == "^") {
                operator.push(argv[i]);
            } else if(argv[i] == "0" || argv[i] == "1" || argv[i] == "2" 
                      || argv[i] == "3" || argv[i] == "4" || argv[i] == "5" 
                      || argv[i] == "6" || argv[i] == "7" || argv[i] == "8" 
                      || argv[i] == "9") {
                operand.push(argv[i]);
            }
        }

        System.out.println(operand);
        System.out.println(operator);

        Stack<String> result = evaluateStack(operand, operator);
        System.out.println(result.toString());
    }
}

当我使用带有编码字符串的调试器时,它显示堆栈已正常填充,但是使用命令行参数,即使for循环完成,它也始终显示具有0个元素的堆栈。我究竟做错了什么?

3 个答案:

答案 0 :(得分:1)

理想情况下,由于您使用了相等运算符,因此未将任何内容推送到堆栈中。您将argv[i] == "<any_str>"修改为argv[i].equals("<any_str>")。然后它应该工作。在字符串比较期间,始终使用equals()方法,因为您永远不会知道字符串是否被实习

答案 1 :(得分:1)

这里有两个问题。首先,应使用String比较Java中的equals。在Java中使用==实际上比较了字符串的地址,而不是它们的内容。第二个问题是,当你打电话给java Expression 1*2+3这样的程序时,argv[0]在这种情况下将是总1*2+3。要解决此问题,您需要遍历String中的每个字符。

编辑:发布后我意识到参数可能是空格分隔的,就像在1 * 2 + 3中一样。

答案 2 :(得分:1)

确保何时使用“==”以及何时使用“等于”....

     "==" will be used to check the equality of the String objects 

    "equals(...)" will be used to the check the content of the String objects.

当您使用equals(...)方法检查操作数时,您的问题将得到解决

运营商