стеки Java и очевидное бессмысленное упражнение

1

Я пытаюсь проверить свое понимание стеков. Пока я начинаю понимать основы, и у меня все еще есть способ пойти, я нашел пример, который вызвал мое любопытство.

Мои исследования включали эту тему:

Понимание оценки 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 ( в связи с одинарными кавычками) и - по- видимому, оператор вычитания. Вычитание нуля - жестко закодированный нуль, в отличие от переменной, которая иногда может оказаться нулевой - кажется бессмысленной.

Мое нынешнее предположение заключается в том, что есть тонко тонкий ответ на этот вопрос - то есть он только/появляется/является бессмысленным упражнением, но есть что-то действительно магическое, что я просто слишком тусклый, чтобы понять.

Спасибо заранее всем здесь - я многому научился от совета - это быстро стало одним из моих любимых и наиболее посещаемых сайтов.

С наилучшими пожеланиями

Теги:
stack

3 ответа

3
Лучший ответ

Поскольку a - это массив char который содержит числовые цифры, a[i++]-'0' - это быстрый способ получить числовое значение char в a[i++]. Подумайте, как вычесть код ASCII для 0 из кода ASCII для того, что находится в этой позиции массива символов.

2

Символы представлены с использованием некоторой кодировки. В ASCII символ 0 представлен 48, 1 - 49 и т.д. Итак, если кодированный символ находится между [48,57] то вычитая '0' (значение 48), вы получите целочисленное значение символа.

0

" -'0' - это просто сокращенный метод преобразования между ascii и ints. Ваш стек хранение одной цифра номера, как chars, см 2 - ое преобразование ниже.

Изображение 174551

Преобразование из 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'
  • 0
    Привет, Рон - здесь куча отличной информации, большое спасибо. Я пытаюсь обернуть голову, осуществляя преобразования в реальном сценарии. Добавление или вычитание значений зависит от типа, с которого вы начинаете, и от того, что вы хотите преобразовать. Это имеет смысл. В ваших примерах вы назначаете 0 для «a» и «A» - я предполагаю, что это просто означает, что это первая буква - я на мгновение растерялся, когда ожидал увидеть значение из таблицы выше (97 или 65). Итак, если x = 1 и мы добавляем «a», это возвращает «b»?
  • 0
    @Mac Да! 1 + 'a' = 'b' Возможно, вам следует проверить, что тип char числовой, 'a' точно такой же, как 97 и 0x61 .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню