【问题标题】:Why does my JavaScript Stack Sort Function not work?为什么我的 JavaScript 堆栈排序功能不起作用?
【发布时间】:2012-09-10 18:08:47
【问题描述】:

这是我的代码:

 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 什么都没有。

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

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);

【问题讨论】:

  • WTF 你要为堆栈排序吗? JS 中堆栈和数组之间的唯一区别是 LIFOness。你把它扔掉,你还不如只使用一个数组。
  • @cHao,我这样做不是为了生产,而是为了我对堆栈的理解。
  • 那么理解这一点:堆栈不需要,也不应该拥有,排序功能。它将堆栈的堆叠性吹到了地狱。他们应该能够做的唯一一件事就是推送、弹出并可能偷看顶部元素。哦,也许可以算一下其中有多少元素。
  • @cHao 没错。 )想用这个来更新我的答案,但我想你的评论在这里很不错。虽然有 优先级队列 这样的东西,但“优先级堆栈”是没有意义的。

标签: javascript sorting stack


【解决方案1】:

可能是因为它的末尾没有return stack?如果没有显式的return 语句,函数将在完成时返回 undefined。

不,这只是锦上添花。其实这段代码有几个逻辑错误:

  • insert() 函数不会将值 (x) 插入到空堆栈中
  • topr() 函数令人困惑。对于非空堆栈,它返回它的最后一个元素(我猜,这可以通过return stack[stack.length - 1] 更有效地完成。但如果堆栈为空,它会将undefined 推送给它(因为它是pop 的结果空数组)。

【讨论】:

  • topr函数没问题,因为它是在if的长度内调用的。但解决方案是:“else{stack.push(x);}”谢谢!
【解决方案2】:

正如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 可以很好地处理这个问题。您对它的理解似乎有点错误。
猜你喜欢
  • 2012-08-08
  • 2015-11-18
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多