我试图验证我对堆栈的理解。在我开始理解基础知识的同时,我还有很长的路要走,我找到了一个激起我好奇心的例子。
我的研究包括这个主题:
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(由于单引号),-
似乎是减法运算符。减去零 - 一个硬编码的零,而不是偶尔可能偶然为零的变量 - 似乎毫无意义。
我目前的假设是,对此有一个非常微妙的答案 - 即它只是/看起来/是一个毫无意义的练习,但是有一些真正神奇的事情发生,我只是太朦胧而无法理解。
先感谢所有人 - 我从建议中学到了很多东西 - 这很快成为我最喜欢和访问量最大的网站之一。
祝你好运
答案 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'
只是ascii
和ints
之间转换的简便方法。您的堆栈将单个数字的数字存储为chars
,请参阅下面的第二个转换。
从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'