0

我在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 个元素的堆栈。我究竟做错了什么?

4

3 回答 3

1

理想情况下,您没有将任何东西压入堆栈,因为您使用了相等运算符。您将您的修改argv[i] == "<any_str>"argv[i].equals("<any_str>"). 然后它应该工作。同样在字符串比较期间,请始终使用equals()方法,因为您永远不会知道字符串是否被留存

于 2012-09-11T05:51:30.380 回答
1

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

编辑:发布后我意识到参数可能是空格分隔的,如1 * 2 + 3.

于 2012-09-11T05:54:43.017 回答
1

确定何时使用“==”以及何时使用“equals”......

     "==" 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(...) 方法检查操作数时,您的问题将得到解决

运营商

于 2012-09-11T06:00:38.007 回答