[アルゴリズム][JS]stack-後置演算


💎 質問する


後置演算式がある場合は、演算結果を出力するプログラムを作成します.
3(5+2)−9を接尾辞演算子として表すと、352+9−となり、結果は12となる.

💎 に答える

const input = '352+*9-';

function solution(input) {
  let stack = [];
  let result = 0;
  const splited = input.split('');
  splited.forEach((el) => {
    if(el === '+') {
      result = parseInt(stack[stack.length - 1]) + parseInt(stack[stack.length - 2]);
      stack.pop();
      stack.pop();
      stack.push(result)
    } else if(el === '-') {
      result = parseInt(stack[stack.length - 2]) - parseInt(stack[stack.length - 1]);
      stack.pop();
      stack.pop();
      stack.push(result)
    } else if(el === '*') {
      result = parseInt(stack[stack.length - 1]) * parseInt(stack[stack.length - 2]);
      stack.pop();
      stack.pop();
      stack.push(result)
    } else if(el === '/') {
      result = parseInt(stack[stack.length - 1]) / parseInt(stack[stack.length - 2]);
      stack.pop();
      stack.pop();
      stack.push(result)
    } else {
      stack.push(el)    
    }
  })
  return stack[0];
}

solution(input);
私は時間制限の問題に集中していますが、残念ながら一度も良いコードが書けませんでした.
重複するコードが多すぎて、可読性も悪く、不要な長いコードになりました.
より簡潔でより良い解答を書く方法は何ですか?もう一度考える必要がある.

再オープン

const input = '352+*9-';

function solution(input) {
  let stack = [];
  let result = 0;
  const splited = input.split('');
  splited.forEach((el) => {
    if(!isNaN(el)) stack.push(Number(el));
    else {
      let rt = stack.pop();
      let lt = stack.pop();
      if(el === '+') stack.push(lt + rt);
      else if(el === '-') stack.push(lt-rt);
      else if(el === '*') stack.push(lt*rt);
      else if(el === '/') stack.push(lt/rt);
    }
  }) 
  return stack[0];
}

solution(input);

💎 Review


1. pop()


pop()メソッドは、配列から最後の要素を削除します.그 요소를 반환.
△どうもよくわからないので、よく使う方法を改めて整理しなければなりません.
したがって、pop()の場合、スタック[stack.length-1]として指定する必要はありません.
直ちにlt=stackを譲ります.pop();指定すればいいです.

2. isNaN()


split()を使用する場合、すべての要素がstringタイプで配列に含まれます.isnanで数値を区別する方法は?
例を見てみましょう.
isNaN("37");      // 거짓: "37"은 NaN이 아닌 숫자 37로 변환됩니다
isNaN("37.37");   // 거짓: "37.37"은 NaN이 아닌 숫자 37.37로 변환됩니다
stringも数値形式に変換できる場合はisnanではありません.
したがってisNaN("3")はfalseで3が数字であることを認識し,isNaN("+")はtrueで数字ではないことを認識する.
気をつけて!
isnan関数が混乱している場合は、ES 15に追加された数字です.覚えておいてください.isnan()に変えるのがもっと適当かもしれません.

Reference

  • https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/isNaN
  • https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/pop
  • インフラストラクチャ-JavaScriptアルゴリズム回答