Javascript给定的数字字符串,DUP,POP,+;,-返回堆栈的最后数目

Javascript给定的数字字符串,DUP,POP,+;,-返回堆栈的最后数目,javascript,stack,Javascript,Stack,所以我有个问题。字符串有数字、DUP、POP、+或-。如果它是一个数字,则该数字将被推送到堆栈中。如果是DUP,则复制并推送最后一个数字。如果弹出,则弹出最后一个数字。如果为+,则最后两个数字相加并弹出,总和被推送到堆栈中。如果-,则将最后一个弹出的数值-第二个弹出的数值推送到堆栈中。 我的逻辑有问题。当我出于某种原因为DUP做案子时,我得到了NaN。“三次重复”我得到了NaN function solution(S){ let arr = S.split(" ");

所以我有个问题。字符串有数字、DUP、POP、+或-。如果它是一个数字,则该数字将被推送到堆栈中。如果是DUP,则复制并推送最后一个数字。如果弹出,则弹出最后一个数字。如果为+,则最后两个数字相加并弹出,总和被推送到堆栈中。如果-,则将最后一个弹出的数值-第二个弹出的数值推送到堆栈中。 我的逻辑有问题。当我出于某种原因为DUP做案子时,我得到了NaN。“三次重复”我得到了NaN

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;iconsole.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
检查您收到的字符串是否可以安全地强制为数字。