javascript - 使用javascript对堆栈元素进行排序

标签 javascript sorting recursion stack

我试图理解使用递归对堆栈元素进行排序 http://www.geeksforgeeks.org/sort-a-stack-using-recursion/ 不允许使用任何循环结构,如 while、for...等。我们只能在Stack S上使用以下ADT函数:

is_empty(S) :测试堆栈是否为空。

push(S):将新元素添加到堆栈中。

pop(S):从堆栈中删除顶部元素。

top(S) :返回顶部元素的值。请注意,这 函数不会从堆栈中删除元素。 我尝试了下面但出现错误

var stack = [-3, 14, 18, -5, 30];

function sortStack() {
  if (stack.length > 0) {
    temp = stack.pop();
    sortStack();
    sortedInsert(temp, stack);
  }
}

function sortedInsert(element, stack) {
  if (stack.length > 0 || element > stack[stack.length - 1]) {
    stack.push(element);
  } else {
    temp = stack.pop();
    sortedInsert(element, stack);
    stack.push(temp);
  }

}

sortStack();

console.log(stack);

RangeError: Maximum call stack size exceeded
at sortedInsert:12:22
at sortedInsert:21:5
at sortedInsert:21:5
at sortedInsert:21:5
at sortedInsert:21:5
at sortedInsert:21:5

最佳答案

使用 javascript,局部(作用域)变量需要声明为 var,否则它们是静态的。如果 sortStack() 中 t 之前没有 var,t 将是一个静态变量,并且每次弹出都会被覆盖,从而在 sortStack() 的所有返回上留下 t == -3。 SortedInsert() 中的 x 也会出现同样的问题。

var stack = [-3, 14, 18, -5, 30];

function sortStack(s) {
  if (s.length > 0) {
    var t = s.pop();
    sortStack(s);
    sortedInsert(s, t);
  }
}

function sortedInsert(s, e) {
  if (s.length == 0 || e > s[s.length - 1]) {
    s.push(e);
  } else {
    var x = s.pop();
    sortedInsert(s, e);
    s.push(x);
  }
}

sortStack(stack);

console.log(stack);

关于javascript - 使用javascript对堆栈元素进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41283590/

相关文章:

javascript - 自定义 Facebook 评论集成(JS SDK)

Javascript 首先对重复值进行排序,然后从小到大的值排序

排序英式日期

javascript - 使用 MVC/Backbone.js 实现复合模式

javascript - TypeError : socket. 发出不是一个函数

javascript - 页面卸载前的事件调用

algorithm - 如果你有一个大小为 14 的二项式堆,你怎么知道哪个节点是根节点?

c# - 如何修改递归算法以找到最短路径?

scala - 在 Spark 上递归构建决策树时,是否需要保存中间数据子集?

linux - Bash目录内容之间的递归相似性