为什么我的JavaScript堆栈排序功能不起作用?

时间:2012-09-10 18:08:47

标签: 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();
      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 no。

修改: 完整的解决方案:

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

2 个答案:

答案 0 :(得分:2)

因为它最终没有return stack,也许?如果没有显式return语句,函数将在完成时返回undefined。

不,这只是锦上添花。实际上,此代码中存在多个逻辑错误:

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

答案 1 :(得分:0)

正如raina77ow已经提到的那样,你没有从sort方法返回任何东西。然后使用您的新更新,您只更新堆栈的本地版本;因此,如果从sort方法返回堆栈,则应该会收到预期的结果。

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