0
0

More than 3 years have passed since last update.

新一二年生のためのくりかえし算数ドリル緊急回避プログラム

Last updated at Posted at 2021-03-26

新一二年生の皆さん。おはようございます。
今日は、逆ポーランド記法の計算の仕方を教えます。

注意:

まだ割り算を習っていない皆さんには、割り算を教えてはいけないので、
割り算の計算方法は教えません。

準備

  • Node.js 14.16.0 (ほかの言語でもできる)
  • Windows10 (かそれ以外)

方法

やり方を教えます。
よく見てください。
1. 逆ポーランド記法の式が入った配列をexpに代入する。
2. 計算する関数calcを用意する。
3. 配列stackを用意する。
4. 6までをexpが空になるまで繰り返す。
5. expをshiftする。
6. 5の値が数値だったら、stackにpushし7まで飛ばす。演算記号だったら、5に進む。
7. stackから2こ切り出し、それを使ってfuncを実行する。
8. 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));
}

ちなみに、動くかどうかは知りません。(未テスト)

終わります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0