大家好,我正在编写一种算法,以从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();
}