java堆栈和一个明显无意义的练习

时间:2014-03-13 19:39:33

标签: java stack

我试图验证我对堆栈的理解。在我开始理解基础知识的同时,我还有很长的路要走,我找到了一个激起我好奇心的例子。

我的研究包括这个主题:

Understanding Postfix-expression Evaluation in Java code using a stack

我对上面引用的主题中的一行感到困惑。

以下是代码的整个部分 - 我的问题是指while循环中的行 - 代码后的详细信息:

     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() + "");
    }
    }

我的问题是:-'0'的目的是什么?如果我正确理解了行的其余部分,我们引用char 0(由于单引号),-似乎是减法运算符。减去零 - 一个硬编码的零,而不是偶尔可能偶然为零的变量 - 似乎毫无意义。

我目前的假设是,对此有一个非常微妙的答案 - 即它只是/看起来/是一个毫无意义的练习,但是有一些真正神奇的事情发生,我只是太朦胧而无法理解。

先感谢所有人 - 我从建议中学到了很多东西 - 这很快成为我最喜欢和访问量最大的网站之一。

祝你好运

3 个答案:

答案 0 :(得分:3)

由于a是一个包含数字的char数组,a[i++]-'0'是一种快速获取char a[i++]数值的方法。可以把它想象成从ASCII码中减去0的ASCII码,无论字符数组的那个位置是什么。

答案 1 :(得分:2)

使用某些编码表示字符。在ASCII中,字符0由48表示,1为49,等等。因此,如果编码字符在[48,57]之间,则减去'0'(值为48)获取字符的整数值。

答案 2 :(得分:0)

-'0'只是asciiints之间转换的简便方法。您的堆栈将单个数字的数字存储为chars,请参阅下面的第二个转换。

enter image description here

从1位int转换为数字char

int x = 1;
char c = x + '0';

从数字char转换为int

char c = '5';
int x = c - '0';

int转换为小写字母char(0 ='a',25 ='z')

int x = 1;
char c = x + 'a';

从小写字母char转换为int

char c = 'm';
int x = c - 'a';

int转换为大写字母char(0 ='A',25 ='Z')

int x = 1;
char c = x + 'A';

从大写字母char转换为int

char c = 'M'; // 'M'=77
int x = c - 'A'; // 77-65=12 therefore 'M is element 12 of the alphabet (A=0)

这些工作原因是:

0+48 = 0+'0' = '0'
0+65 = 0+'A' = 'A'
0+97 = 0+'a' = 'a'