大家好,我正在编写一种算法,以从NodeTree中删除具体分支(例如DSF)。如果选择节点名称,则算法将检查该节点是否是另一个节点的父节点;如果是,它将使用该节点的子节点,并添加到堆栈中,依此类推。希望代码能说明这一点。

问题是循环do / while被执行两次,而我认为应该执行一次。一会儿,在空条件下发生了一些事情,因为它被跳过了。

  stack.push(keys.head);
    // visited.push(flag.data);
    while(stack.size>0){
        stackTemp=stack.get()

        stack.pop();
        do{
          values=stackTemp.next;
          stack.push(values);
          stackTemp=values.next;
          stack.show();

        }while (!stackTemp)
        stackTemp=stack.get()
        // console.log(stackTemp);
        keyTemp=this.map.get(stackTemp.data);
        if(keyTemp=undefined)
        stack.pop();

      }


我还检查了“ stackTemp!==“。有任何想法吗?如果不清楚,抱歉,我会尽力解释。
问候!

最佳答案

似乎这些评论不足以使您感到困惑,然后我将添加解释并加上我自己的解释:

_Bergi建议您出于某种原因使用while的另一种语法:do{ /*code*/ }while(condition)不管条件如何,都会至少执行一次代码。您可能要使用while(condition){ /*code*/ },因为使用这种语法,如果条件失败,则不会进入循环,而您的条件是“如果存在var值”,那么您就不想输入如果失败。

_关于另一件我将不解释的事情(因为我想保持尽可能的清晰,这是更高级的功能),乔纳斯·W(Jonas W.)表示您的情况不正确。而意思是“只要”。您的代码告诉“只要stackTemp为假(或为空,未定义等),请保持循环”。您可能想相反。

_最后,将stackTemp.next存储在values中以将其放置在数组中是没有用的。如果它是对象(或函数),则不会复制其值,因为JS通过引用传递它们。您可以只将stackTemp.next存储在数组中,这将是相同的,因为stackTemp紧随其后被替换,其引用已更改,并且存储在数组中的stackTemp.next不会受到影响。

这将是结果,如果它仍然不起作用,则来自其他原因:

stack.push(keys.head);
// visited.push(flag.data);
while(stack.size>0){
    stackTemp=stack.get()

    stack.pop();
    while (stackTemp){ //not supposed to enter here is stackTemp is empty
      stack.push(stackTemp.next);
      stackTemp=stackTemp.next; //stackTemp reference is replaced
      stack.show();
    }
    stackTemp=stack.get()
    // console.log(stackTemp);
    keyTemp=this.map.get(stackTemp.data);
    if(keyTemp=undefined)
    stack.pop();

}

07-24 20:29