我正在尝试为RPN计算器构建一个add方法:
function RPNCalculator() {
if (!(this instanceof RPNCalculator)) return new RPNCalculator();
}
RPNCalculator.prototype.arr = [];
RPNCalculator.prototype.sum=0;
RPNCalculator.prototype.push = function(num){
this.arr.push(num);
return this.arr;
};
RPNCalculator.prototype.plus = function(){
var newarr = [];
for (var i = this.arr.length - 1; i >= 0; i--) {
newarr.push(this.arr[i]);
}
this.sum = newarr.reduce(function(p, n){
return p + n;
}, 0);
return this.sum;
};
问题是 - 在测试我比较我的方法时,似乎他们想要一次添加两个值。
这是来自测试:
it('adds three numbers', function() {
// Infix: 2+3+4
// Postfix: 2 3 4 + +
rpnCalculatorInstance.push(2);
rpnCalculatorInstance.push(3);
rpnCalculatorInstance.push(4);
rpnCalculatorInstance.plus();
expect(rpnCalculatorInstance.value()).toEqual(7);
rpnCalculatorInstance.plus();
expect(rpnCalculatorInstance.value()).toEqual(9);
});
使用我的版本运行一次它会添加数组中的所有值 - 在测试版本中它似乎是在调用方法时添加前两个值以及下一次调用方法时(调用方法时)第一个呼叫的总和将被添加到下一个值。
最初听起来很像reduce方法,但显然情况并非如此。那么有人可以解释如何实现测试大纲的方式以及为什么这是合乎逻辑的?存储值的实用程序是什么,但一次只增加两个?
谢谢!
更新
RPNCalculator.prototype.sum = 0;
RPNCalculator.prototype.push = function(num){
this.arr.push(num);
return this.arr;
};
RPNCalculator.prototype.plus = function(){
this.sum += this.arr.push(this.arr.pop() + this.arr.pop());
};
RPNCalculator.prototype.pop = function() {
return this.arr.pop();
};
RPNCalculator.prototype.value = function(){
return this.sum;
};
答案 0 :(得分:1)
我理解RPN是正确的,你需要弹出堆栈的最后两个值并在算术运算后推送值,所以你需要一些pop,比如
RPNCalculator.prototype.pop = function() {
return this.arr.pop();
};
使用加号运算符
RPNCalculator.prototype.plus = function() {
this.arr.push(this.arr.pop() + this.arr.pop());
};