У меня есть этот код:
#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'));
Похоже, это алгоритм, который читает и рассчитывает Обратная (постфиксная) польская запись.
Например,
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
, Получить последний номер из стека (0), сделать 0 * 10 + 1
= 1. Вставить обратно в стек
читать 2
, Получить последний номер из стека (1), сделать 1 * 10 + 2
= 12. Отодвинь
читать 3
, Получить последний номер из стека (12), сделать 12 * 10 + 3
= 123. Отодвинь это.
Большой! 123 число было прочитано.
Однако этот пример кода представляет собой кучу плохих практик.
Pop
а также Push
, но нет readStack()
а также inStack()
,readStack()
не обеспечивает это.if
с вместо switch
заявление.