Расчет в польской записи

У меня есть этот код:

#include <iostream>
#include <string>
#include “stack.h”
int main (int argc, char *argv[]) {
char *a = argv[1];
int N = strlen(a);
stack<int> polish(N); int el;
for (int i = 0; i < N; i++){
if (a[i] == '+'){
el = polish.readStack(); polish.outofStack();
polish.inStack( el + polish.readStack()); polish.outofStack()
}
if (a[i] == '*'){
el = polish.readStack(); polish.outofStack();
polish.inStack(el * polish.readStack()); polish.outofStack()
}
if ((a[i] >= '0') && (a[i] <= '9')){
el = polish.readStack(); polish.outofStack()
polish.inStack(10 * el + (a[i++]-'0'));
}
}
cout << polish.outofStack() << endl;
}

Как это работает? И что означает эта линия?

polish.inStack(10 * el + (a[i++]-'0'));

0

Решение

Похоже, это алгоритм, который читает и рассчитывает Обратная (постфиксная) польская запись.

Например,

1 2 3 + 4 - -

средства

Add 1; add 2; add 3; sum up the last two; add 4; substract the last two; substract the last two.

то есть

1 - ((2 + 3) - 4) = 0

Эта строка кода:

polish.inStack(10 * el + (a[i++]-'0'));

Предполагается объединить число путем добавления цифр.
(a[i++]-'0') преобразует из цифры в цифре, как «3» в целое число 3.

Изначально в нашем стеке есть ноль.
Например, если у вас есть «123», он будет читать их как char:

  1. читать 1, Получить последний номер из стека (0), сделать 0 * 10 + 1 = 1. Вставить обратно в стек

  2. читать 2, Получить последний номер из стека (1), сделать 1 * 10 + 2 = 12. Отодвинь

  3. читать 3, Получить последний номер из стека (12), сделать 12 * 10 + 3 = 123. Отодвинь это.

  4. Большой! 123 число было прочитано.

Однако этот пример кода представляет собой кучу плохих практик.

  1. Это общеизвестная практика именовать функции стека Pop а также Push, но нет readStack() а также inStack(),
  2. Структура стека требует удаления элемента после чтения. readStack() не обеспечивает это.
  3. Несколько ifс вместо switch заявление.
  4. Никогда не увеличивайте свой счетчик в цикле.
  5. Этот код на самом деле не работает, потому что он не разделяет значения.
0

Другие решения


По вопросам рекламы [email protected]