新一二年生の皆さん。おはようございます。
今日は、逆ポーランド記法の計算の仕方を教えます。
注意:
まだ割り算を習っていない皆さんには、割り算を教えてはいけないので、
割り算の計算方法は教えません。
準備
- Node.js 14.16.0 (ほかの言語でもできる)
- Windows10 (かそれ以外)
方法
やり方を教えます。
よく見てください。
- 逆ポーランド記法の式が入った配列をexpに代入する。
- 計算する関数calcを用意する。
- 配列stackを用意する。
- 6までをexpが空になるまで繰り返す。
- expをshiftする。
- 5の値が数値だったら、stackにpushし7まで飛ばす。演算記号だったら、5に進む。
- stackから2こ切り出し、それを使ってfuncを実行する。
- stackからpopし、値をreturnする。
お手本
var exp = []//"逆ポーランド記法の式"// //1
var calc = {"+":args=>args[0] + args[1],"-":args=>args[0]-args[1],"*":args=>args[0]*args[1]}//2
var stack = []//3
while(exp.length) {//4
var now = exp.shift()//5
if(!isNaN(now)) {//6
stack.push(now)
} else {
var args = stack.splice(-2);
stack.push(calc[now](args))
}
}
var result = stack.pop();
#清書
では、清書しましょう。
function exe(porn) {
var calc = {
"+":p=> p[0]+p[1],
"-":p=> p[0]-p[1],
"*":p=> p[0]*p[1],
}
return porn.reduce((res,now)=> {
if(calc[now]) {
res.push(calc[now](res.splice(-2)))
} else {
res.push(now)
}
return res;
},[]).pop()
}
完成です。
このJSプログラムをまとめます。
function toPN(formula) {
var priority = {"+":1,"-":1,"*":2};
return formula.split(" ").reduce(($,now)=> {
if(priority[now]) {
if(priority[$[1][0]]>= priority[now]) $[0].push($[1].shift())
$[1].unshift(now)
} else $[0].push(+now)
return $;
},[[],[]]).flat()
}
function calc(porn) {
var func = {
"+":p=> p[0]+p[1],
"-":p=> p[0]-p[1],
"*":p=> p[0]*p[1],
}
return porn.reduce((res,now)=> {
if(func[now]) {
res.push(func[now](res.splice(-2)))
}else res.push(now)
return res;
},[]).pop()
}
function exe(exp) {
return calc(toPN(exp));
}
ちなみに、動くかどうかは知りません。(未テスト)
終わります。