为什么我的JavaScript堆栈排序函数不起作用?

为什么我的JavaScript堆栈排序函数不起作用?,javascript,sorting,stack,Javascript,Sorting,Stack,这是我的密码: function sort(stack){ if(stack.length > 0){ var x = stack.pop(); sort(stack); insert(x,stack); } } function insert(x,stack){ if(stack.length>0){ var tops = topr(stack); if(tops>x){ stack.pop(); ins

这是我的密码:

 function sort(stack){
  if(stack.length > 0){
   var x = stack.pop();
   sort(stack);
   insert(x,stack);
  }
}
function insert(x,stack){
  if(stack.length>0){
    var tops = topr(stack);
    if(tops>x){
      stack.pop();
      insert(x,stack);
      stack.push(tops);
    }else{
      stack.push(x);
    }
  }
}

function topr(stack){
 var t = stack.pop();
  stack.push(t);
  return t;
}
var stack = [1,3,2];
sort(stack);
console.log(stack);
我必须在不使用数组(递归)的情况下构建它。 但它在控制台中返回void/aka nothing

编辑: 完整的工作解决方案:

function sort(stack) {
    if(stack.length > 0) {
        var x = stack.pop();
        sort(stack);
        insert(x,stack);
    }
    return stack;
}

function insert(x,stack){
  if(stack.length>0){
    var tops = topr(stack);
    if(tops>x){
      stack.pop();
      insert(x,stack);
      stack.push(tops);
    }else{
      stack.push(x);
    }
  }else{
   stack.push(x);
  }
}

function topr(stack){
 var t = stack.pop();
  stack.push(t);
  return t;
}
var stack = [1,3,2];
stack = sort(stack);
console.log(stack);
因为它的末尾可能没有
返回堆栈
?如果没有显式的
return
语句,函数将在完成时返回undefined

不,那只是蛋糕上的糖霜。事实上,此代码中有几个逻辑错误:

  • insert()
    函数不向空堆栈插入值(
    x
  • topr()
    函数令人困惑。对于非空堆栈,它返回其最后一个元素(我想,只需使用
    返回堆栈[stack.length-1]
    就可以更有效地执行此操作。但如果堆栈为空,它会将
    未定义的
    推送到它(因为它是
    弹出的
    空数组的结果)

如raina77ow所述,您不会从排序方法返回任何内容。然后,使用新的更新,您只会更新堆栈的本地版本;因此,如果您从排序方法返回堆栈,您应该会收到预期的结果

function sort(stack) {
    if(stack.length > 0) {
        var x = stack.pop();
        stack = sort(stack);
        insert(x,stack);
    }

    return stack;
}

var stack = [1,3,2];
stack = sort(stack);
console.log(stack);

我更新了我的答案。我没有注意到您在sort方法中再次调用了sort。您很可能还需要从其他函数返回值。我将继续研究这个问题。谢谢Josh!我怀疑JavaScript可能不适合这种递归操作(可能指针被某种垃圾收集器删除了)不,我很确定javascript可以很好地处理这个问题。你对它的理解似乎有点错误。你是在为堆栈排序吗?JS中堆栈和数组之间的唯一区别是可靠性。如果你把它扔掉,你可能只是在使用数组。@cHao,我这样做不是为了生产,而是为了我对堆栈。然后理解这一点:堆栈不需要,甚至不应该有排序功能。这会把堆栈的堆栈性搞得一塌糊涂。它们唯一能做的就是推、弹出,甚至可能偷看顶部的元素。哦,也许还能计算出其中有多少个元素。@cHao正是如此。)我想用这个更新我的答案,但我想你的评论在这里很好。虽然有优先级队列这样的东西,“优先级堆栈”根本没有意义。topr函数是可以的,因为它在长度if内调用。但是解决方案是:“else{stack.push(x);}”谢谢!