Я пытаюсь проверить свое понимание стеков. Пока я начинаю понимать основы, и у меня все еще есть способ пойти, я нашел пример, который вызвал мое любопытство.
Мои исследования включали эту тему:
Понимание оценки Postfix-выражения в Java-коде с использованием стека
Меня смущает одна строка, в частности, из потока, на который я ссылался выше.
Вот весь раздел кода - мой вопрос относится к строке внутри цикла 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'
: какая цель -'0'
? Если я понимаю, остальные линии должным образом, мы ссылаемся на символ 0 ( в связи с одинарными кавычками) и -
по- видимому, оператор вычитания. Вычитание нуля - жестко закодированный нуль, в отличие от переменной, которая иногда может оказаться нулевой - кажется бессмысленной.
Мое нынешнее предположение заключается в том, что есть тонко тонкий ответ на этот вопрос - то есть он только/появляется/является бессмысленным упражнением, но есть что-то действительно магическое, что я просто слишком тусклый, чтобы понять.
Спасибо заранее всем здесь - я многому научился от совета - это быстро стало одним из моих любимых и наиболее посещаемых сайтов.
С наилучшими пожеланиями
Поскольку a
- это массив char
который содержит числовые цифры, a[i++]-'0'
- это быстрый способ получить числовое значение char
в a[i++]
. Подумайте, как вычесть код ASCII для 0
из кода ASCII для того, что находится в этой позиции массива символов.
Символы представлены с использованием некоторой кодировки. В ASCII символ 0
представлен 48, 1
- 49 и т.д. Итак, если кодированный символ находится между [48,57]
то вычитая '0'
(значение 48), вы получите целочисленное значение символа.
" -'0'
- это просто сокращенный метод преобразования между ascii
и ints
. Ваш стек хранение одной цифра номера, как chars
, см 2 - ое преобразование ниже.
Преобразование из 1-значного int
в числовой char
int x = 1;
char c = x + '0';
Преобразование из числового char
в int
char c = '5';
int x = c - '0';
Преобразование из int
в нижний регистр алфавитный char
(0 = "а", 25 = "г")
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'
char
числовой,'a'
точно такой же, как97
и0x61
.