Пишу калькулятор, написал скрипт, который принимает инфиксную запись в таком формате:
10 - 2 * 2
(с пробелами между операндами и операторами).
Схема алгоритма такая:
1. Сначала берётся строка с экрана калькулятора
2. Создаётся постфиксная запись этого выражения
3. Считается выражение этой постфиксной нотации
Так же имею следующий код, который отвечает за пользовательский ввод на экран калькулятора:
function write(symbol) {
var last = document.getElementById('output').outerText;
if (last == 0 && last != "0.") {
document.getElementById('output').innerText = symbol;
} else if (symbol == "+" || symbol == "-" || symbol == "*") {
var str = last + " " + symbol + " \0 "
document.getElementById('output').innerText = str;
} else {
document.getElementById('output').innerText = last + symbol;
}
}
Просто, чтобы были пробелы между операторами и операндами, пришлось использовать символ пустой маски (
" \0"
).
Но вот что происходит на деле:
Он не принимает постфиксную строку на вход моей ф-ции, которая считает по постфиксной нотации выражение
// Calculate via postfix notation
function rpn(input) {
var ar = input.split(/\s+/), st = [], token;
while (token = ar.shift()) {
if (token == +token) {
st.push(token);
} else {
var n2 = st.pop(), n1 = st.pop();
var re = /^[\+\-\/\*]$/;
if (n1 != +n1 || n2 != +n2 || !re.test(token)) {
throw new Error('Invalid expression: ' + input);
}
st.push(eval(n1 + token + ' ' + n2));
}
}
if (st.length !== 1) {
throw new Error('Invalid expression: ' + input);
}
return st.pop();
}
Да и вообще, у меня со строкой, которая взята с экрана ввода (DOM-HTML элемент) явно что-то не то - на блокноте отображается только первый символ.
И да, я понимаю, что кальк крашится из-за эксепшона, но я не могу понять почему - строка же на вид валидная:
Никак не понимаю вообще, что происходит. Ведь сам мой алгоритм по отдельности работает (только не забывайте про пробелы между символами!):
https://jsfiddle.net/mzp7w7L7/1/
Ну и весь код этого калькулятора
тут.