Comments 9
Как-то пахнуло Turbo Pascal и лабами с первого семестра.
Если уже Котлин — то, как мне кажется, нужно стараться делать идиоматично.
Всякие иммутабельности, ФП, можно еще библиотеки типа arrow прикрутить, это же доя себя задачка.
А просто ифов написать с регекспами — разницы с тем же питоном особо нет, разве что скобки, но в питоне со списками красивее даже выйдет, если влоб делать.
Ужасный, никому не нужный велосипед. Берем любой готовый инструмент, например для создания PEG парсеров, и получаем код примерно того же объема, который будет существенно проще расширяться, и намного лучше читаться.
Я вас не понял, причем здесь другие инструменты? Я просто описал алгоритм преобразования из инфиксной записи в постфиксную. А по коду на Kotlin, если использовать все возможности Kotlin, то код был бы меньше, но понять его было бы труднее.
Попробуйте добавить в свой калькулятор возведение в степень, или функции. Останутся от кода рожки да ножки. Мораль — велосипед барахло, не нужно такие писать, и тем более не нужно таким хвалиться.
Я рад, что вы заинтересовались моей первой публикацией на хабре.
Но хотел бы вам, возразить. Во-первых, я ни коим образом не хвалюсь, так как алгоритм придумал не я, я его просто описал. Если вам не интересно, можете не обращать внимания и пройти мимо. Я думаю, что кому-то это пригодится.
Во-вторых, специально для вас я добавил в код несколько строчек и он уже легко считает возведение в степень. Так как возведение в степень имеет более высокий приоритет чем +-*/.
Но хотел бы вам, возразить. Во-первых, я ни коим образом не хвалюсь, так как алгоритм придумал не я, я его просто описал. Если вам не интересно, можете не обращать внимания и пройти мимо. Я думаю, что кому-то это пригодится.
Во-вторых, специально для вас я добавил в код несколько строчек и он уже легко считает возведение в степень. Так как возведение в степень имеет более высокий приоритет чем +-*/.
функция getPostFixEx
// Добавляем новое условие
it == "^" -> {
push(it)
}
функция calcPostFix
item == "^" -> {
stack[stack.lastIndex - 1] = (stack[stack.lastIndex - 1].toDouble()
.pow(stack.last())).toInt()
stack.removeAt(stack.lastIndex)
}
Так как возведение в степень имеет более высокий приоритет чем +-*/. Для возведения в степень необходимо добавить пару строк в код.
функция getPostFixEx
// Добавляем новое условие
it == "^" -> {
push(it)
}
функция calcPostFix
item == "^" -> {
stack[stack.lastIndex - 1] = (stack[stack.lastIndex - 1].toDouble()
.pow(stack.last())).toInt()
stack.removeAt(stack.lastIndex)
}
Sign up to leave a comment.
Преобразование инфиксной нотации в постфиксную