Javascript给定的数字字符串,DUP,POP,+;,-返回堆栈的最后数目
所以我有个问题。字符串有数字、DUP、POP、+或-。如果它是一个数字,则该数字将被推送到堆栈中。如果是DUP,则复制并推送最后一个数字。如果弹出,则弹出最后一个数字。如果为+,则最后两个数字相加并弹出,总和被推送到堆栈中。如果-,则将最后一个弹出的数值-第二个弹出的数值推送到堆栈中。 我的逻辑有问题。当我出于某种原因为DUP做案子时,我得到了NaN。“三次重复”我得到了NaNJavascript给定的数字字符串,DUP,POP,+;,-返回堆栈的最后数目,javascript,stack,Javascript,Stack,所以我有个问题。字符串有数字、DUP、POP、+或-。如果它是一个数字,则该数字将被推送到堆栈中。如果是DUP,则复制并推送最后一个数字。如果弹出,则弹出最后一个数字。如果为+,则最后两个数字相加并弹出,总和被推送到堆栈中。如果-,则将最后一个弹出的数值-第二个弹出的数值推送到堆栈中。 我的逻辑有问题。当我出于某种原因为DUP做案子时,我得到了NaN。“三次重复”我得到了NaN function solution(S){ let arr = S.split(" ");
function solution(S){
let arr = S.split(" ");
let stack = [];
for(let i = 0; i < arr.length; i++){
if(typeof parseInt(arr[i]) == "number") {
stack.push(parseInt(arr[i]));
continue;
} if (arr[i] == "DUP") {
let len = stack.length;
console.log(len)
let lastNum = stack[stack.length-1]
stack.push(parseInt(lastNum));
console.log(stack)
}
}
return stack.pop();
}
函数解决方案{
设arr=S.split(“”);
让堆栈=[];
for(设i=0;i
您需要对数字进行不同的检查。通过使用到数字的转换,可以得到数字的类型(NaN
是一个数字,但不是函数意义上的有效值)
相反,检查是否有一个有限数(),并将一个数推送到数组中
函数解决方案{
设arr=S.split(“”);
让堆栈=[];
for(设i=0;i console.log(解决方案('3dup'))代码>我建议采用一种截然不同的方法。如果我们将操作简化为函数,并将它们存储在一个按名称键控的对象中,我们就可以更容易地进行扩展
const单词={
‘DUP’:(a)=>[a,a],
‘POP’:(a)=>[],//也就是下降
“+”:(a,b)=>[a+b],
“-”:(a,b)=>[a-b],
}
常量applyOp=(堆栈,op)=>
[
…(堆栈切片(0,-(运算长度)),
…op(…堆栈切片(-op.length))
]
常量进程=(输入)=>
投入。减少(
(stack,word)=>word-in-words?applyOp(stack,words[word]):[…stack,word],
[]
)
常量peek=(数组)=>
数组[array.length-1]
常量解决方案=(str)=>
聚醚醚酮(peek)工艺(
str.split(“”).map(w=>isFinite(w)?数字(w):w)
))
控制台日志(
解决方案('35 DUP++2-')
//=> 11 (3 + (5 + 5) - 2)
)
您是否有一些用于调用函数和所需结果的数据?S=“3 DUP”并且应该返回3 bc stack=[3,3]要清楚,typeof NaN===“number”
,但根据定义,NaN
不是一个数字。看见基本上,NaN
是一种数字类型。您可以使用全局isNaN
检查您收到的字符串是否可以安全地强制为数字。