逆ポーランド電卓
from 20240806
逆ポーランド電卓
を作る
実装のポイント
スタックから取り出すときの二項の扱い方
+と*はそのまま順番を気にせず、スタックから2個取り出して足し合わせればよい
a + b = b + a
a * b = b * a
/や-は、左辺と右辺の順番が大事
一時変数においてから計算
code:ts
console.log("execute result:", (() => {
var inputs = "1 2 3 - * 4 5 + +".split(" ");
// var inputs = "2 3 +".split(" ");
var stack = [];
var answer = 0;
type Operator = (a: number, b: number) => number;
var add: Operator = (a, b) => a + b;
var substact: Operator = (a, b) => a - b;
var multiply: Operator = (a, b) => a * b;
var divide: Operator = (a, b) => a / b;
const isOperator = (char: String) =>
"+ - / *"
.split(" ")
.reduce(
(includes, currentOperator) => {
if (includes)
return includes;
return char.includes(currentOperator);
},
false
);
var getFunc = (char: string) => {
if (char === "+")
return add;
else if (char === "-")
return substact;
else if (char === "*")
return multiply;
else if (char === "/")
return divide;
else
return undefined;
}
function factory(a: number) {
if (typeof a === 'undefined')
return undefined;
var f = (b: number) => {
var g = (callback: Function) => {
console.debug([factory]: a=${a} b=${b});
return callback(a, b);
}
return g;
}
return f;
}
// parse
for (var i = 0; i < inputs.length; ++i) {
var char = inputsi;
var isOp = isOperator(char);
console.log(isOp=${isOp} c="${char}");
if (isOp) {
var fnc = getFunc(char);
if (typeof fnc === 'undefined')
return 1;
var last = stackstack.length - 1;
console.log(last=${last})
stack.pop();
var f = factory(last);
if (typeof f === 'undefined')
return 2;
last = stackstack.length - 1;
stack.pop();
var g = f(last);
var h = g(fnc);
answer = h;
stack.push(answer);
} else {
stack.push(parseInt(char));
}
}
answer = stackstack.length - 1;
console.log(answer);
return 0;
})());