嘿伙计们我正在编写一个算法来从NodeTree中移除具体的分支(就像DSF一样)。如果选择节点算法的名称,则检查此节点是否是另一个节点的父节点;如果是,它需要此节点的子节点,并添加到堆栈等。希望代码能够呈现出来。
问题是当我认为应该执行一次时,循环执行/执行两次。内部出现空状态的事情,因为它被跳过了。
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!==”。有任何想法吗?如果事情不清楚,抱歉我会尝试解释。 此致!
答案 0 :(得分:2)
似乎评论不足以让你妨碍我,然后我会添加解释,添加我自己的:
_Bergi建议您使用do{ /*code*/ }while(condition)
的另一种语法,原因如下:while(condition){ /*code*/ }
将至少执行一次代码,无论条件如何。您可能希望使用stackTemp
,因为使用此语法,如果条件失败,您将不会进入循环,并且您的条件是“如果存在var值”,则您不希望输入
_另一件事我不会解释(因为我希望保持尽可能清晰,这是一个更高级的功能),Jonas W.评论说你的情况是错误的。虽然意思是“只要”。只要stackTemp.next
为假(或空,未定义等),您的代码就会“保持循环”。你可能想要相反的。
_最后,将values
存储在stackTemp.next
中以将其放入数组中是没用的。如果它是一个对象(或函数),则不会复制它的值,因为JS通过引用传递它们。您可以将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();
}
不会受到影响。
这将是结果,如果它仍然不起作用,来自其他东西:
{{1}}