JavaScript のスタックを使用して、RPN (逆ポーランド記法) 入力メソッドを備えた電卓を作成しようとしています。
入力: [1, 5, '+', 6, 3, '-', '/', 7, '*']
1 はオペランドであり、スタックにプッシュされます。
5 はオペランドであり、スタックにプッシュされます。
「+」は演算子で、1 と 5 をポップし、計算して結果をスタックにプッシュします。
6 はオペランドであり、スタックにプッシュされます。
3 はオペランドであり、スタックにプッシュされます。
「-」は演算子で、6 と 3 をポップし、減算して結果をスタックにプッシュします。
「/」は演算子で、6 と 3 をポップし、それらを分割して結果をスタックにプッシュします。
7 はオペランドであり、スタックにプッシュされます。
'*' は演算子で、2 と 7 をポップし、それらを乗算して結果をスタックにプッシュします。
出力: [14]
コードをより効果的にするための他の代替手段はありますか?
const x1 = x.push(1);
const x2 = x.push(5);
const x3 = x.push('+');
x.pop(1);
x.pop(5);
x.pop('+');
x.push(1+5);
const x4 = x.push(6);
const x5 = x.push(3);
const x6 = x.push('-');
x.pop(6);
x.pop(3);
x.pop('-');
x.push(6-3);
const x7 = x.push('/');
x.pop(6);
x.pop(3);
x.pop('/');
x.push(6/3);
const x8 = x.push(7);
const x9 = x.push('*');
x.pop(2);
x.pop(7);
x.pop('*');
x.push(2*7);
console.log(x);
A.これは接頭辞ではなく接尾辞です。 B. パラメーターなしで x.pop() を呼び出し、ポップからの結果を使用する必要があります。また、コード内で +-*/ を使用するのではなく、それぞれ 2 つのパラメーターを取る加算、減算、乗算、除算の関数を作成する必要があります。
– ControlAltDel
2020 年 9 月 4 日 17:27
ああ、そうだね、悪いね。それはポストフィですバツ。わかりました、試してみます。ありがとう
– マカロフ19
2020 年 9 月 6 日 13:10
------------------------
すべての演算子のオブジェクトを取得し、入力の値が演算子であるかどうかを確認してから、スタックのポップされた値を反転して演算を実行するか、値をスタックにプッシュできます。
const
operators = {
'+': (a, b) => a + b,
'-': (a, b) => a - b,
'*': (a, b) => a * b,
'/': (a, b) => a / b
},
input = [1, 5, '+', 6, 3, '-', '/', 7, '*'],
stack = [];
input.forEach(value => {
stack.push(value in operators
? operators[value](...stack.splice(-2))
: value
);
console.log(...stack);
});
.as-console-wrapper { max-height: 100% !important; top: 0; }
3
1
うわー、これは非常に簡潔な実装です。 +1
– ControlAltDel
2020 年 9 月 6 日 14:52
つまり、入力から要素を取り出して新しい配列スタックにプッシュするだけです。 .pop() を使用する必要はありませんか?
– マカロフ19
2020 年 9 月 8 日 7:03
3
はい。ただし、stack.splice(-2, 2) はスタックの最後の 2 つの値を削除し、それらを返します。配列。この配列は、操作のパラメータとして分散されます。
– ニーナ・ショルツ
2020 年 9 月 8 日 7:07