使用堆栈中的Java代码理解后缀表达式评估(Understanding Postfix-expres

2019-10-17 15:30发布

我得到的一小段代码破译,解释和改进提供任何建议。 有人告诉我,它的工作原理,我们不能运行的代码来测试它。 我非常理解,但只需要有人来运行它,以确保什么,我理解它是正确的,请得到任何帮助,解释什么,我不understand.I一直在做一吨的研究,仍然有一些的问题。

该代码实现用于读取只使用乘法和加法后缀表达式。 然后计算表达式而保存结果到堆栈。 然后打印出结果。 操作数被压入堆栈,然后当它读取操作,它从堆栈执行计算并把结果存储回堆栈中弹出顶部2操作数。

该计划假定整数和运营商都通过某种像一个空格或什么性质的界定,但不会在所有检查输入的合法性。

 public static void main(String[] args)
{
    char[] a = args[0].toCharArray();
    int N =a.length;
    intStack s = new intStack();
    for (int i = 0; i<N; i++)
    {
        if (a[i]=='+')
        {
            s.push(s.pop() + s.pop());
        }
        if (a[i]=='*')
        {
            s.push(s.pop() * s.pop());
        }
        if ((a[i] >= '0') && (a[i] <= '9'))
        {
            s.push(0);
        }
        while ((a[i] >= '0') && (a[i] <= '9'))
        {
            s.push(10*s.pop() + (a[i++]-'0'));
        }
        Out.println(s.pop() + "");
    }
}

交的修复表达例如:2 3 5 + * = 16

我很困惑,当谈到持续if语句和while循环。

因此,它推动它将存储一个#0 0-9数字字符的第一次,然后以10弹出使得0,多发性它并将它添加到下一个数字字符(如果有一个),其被转换成int和推结果返回到堆栈? 如果是这样,为什么一0压入堆栈?

如果不是第0-9号字符转换为int数据类型,将其推入堆栈,然后进入while循环?

然后在While循环,读取该阵列,并保持转换0-9编号字符为int数据类型和将它们推到堆栈,直到一个字符被读取不同?

我也看不出它是递增INT I while循环或打破while循环推进到下一个字符?

Answer 1:

零初始推力是有点混乱。 了解发生了什么事情在那里,关键是要看到, i是不会增加。 当代码看到,说, '4' ,其为第一数字的"42"时, if语句推零; 然后循环立即十弹出它,乘,加4 ,并回绝。 i前进到下一个字符(即2 ),然后将环路弹出4由10,乘,加2 ,并存储回42 -所期望的结果。

有一个在代码中的错误:当表达式的数字结尾,你会得到一个索引越界异常。 例如, 42是一个有效的后缀表达式(不具有运营商是OK,是吗?)的内环将前进经过所述字符串的末尾,从而引起一个异常。



文章来源: Understanding Postfix-expression Evaluation in Java code using a stack