当前位置: 首页 > 知识库问答 >
问题:

在 2n 空间中对堆栈进行排序

洪光霁
2023-03-14

我已经在Java和C中找到了这个问题的几个实现,但我还没有找到一个使用JavaScript的示例。这是一个相当常见的技术面试问题:

在2n空间中对堆栈进行排序。(仅使用2个堆栈对堆栈进行排序

共有1个答案

邹弘
2023-03-14

我们可以在给定堆栈和临时缓冲区的情况下实现简单的非递归气泡排序:

  1. 迭代地从堆栈中弹出两个元素,如果第一个元素更大,则交换这两个元素,然后将它们推回缓冲区。
  2. 重复步骤 1,但反转方向,因此缓冲区中的所有元素最终将返回到堆栈上。

重复步骤1.和2.直到不再需要交换元素。

function bubble(stack, buffer, up = true) {
  let swaps = 0;
  let last = stack.pop();
  while (stack.length > 0) {
    let next = stack.pop();
    if (up ? last > next : last < next) swaps++;
    else [next, last] = [last, next];
    buffer.push(next);
  }
  buffer.push(last);
  return swaps;
}

function sort(stack, up = true, buffer = []) {
  do bubble(stack, buffer, !up);
  while (bubble(buffer, stack, up) > 0);
  return stack;
}

// Example:
console.log(sort([6,3,9,3,2,8])); // [2, 3, 3, 6, 8, 9]
 类似资料:
  • 我试图找出以下问题的最佳解决方案:给定一个范围为1-5的20个整数的堆栈,对堆栈进行排序,使只有1-4的值保持升序。您一次只能移动一个值。 我实现了一个迭代的 我应该考虑哪一种类型?我应该考虑哪些数据类型?对于给定的问题,最好的可能更坏的情况是什么O(?)?

  • 输入=堆栈数 但是你只能弹出输入,你不能推到它。输出也是另一个堆栈,你可以返回并推到它,但不能弹出 所以如果 由于您无法在中返回到

  • 我正在阅读《破解编码面试》一书,遇到了一个问题:“编写一个程序,按升序对堆栈进行排序。您可以使用其他堆栈来保存项目,但不能将元素复制到任何其他数据结构(如数组)中。堆栈支持以下操作:push、pop、peek、isEmpty。” 这本书用O(n^2的时间复杂度和空间复杂度给出了答案。 但是,我偶然发现了这个博客,它使用快速排序方法在O(n log n)时间复杂性中提供了答案。 我想知道的是空间复杂

  • 有3个堆栈-A、B、C 堆栈A和B被排序(堆栈顶部的数字最大)。堆栈C为空,仅允许5次操作: 推,弹出,顶,is_empty,创建 我们需要编写一个函数来接收堆栈A和B,将堆栈A和B中的所有数字移动到堆栈C,堆栈C必须排序(最大数字在顶部)。 我有算法: 比较A的顶部和B的顶部 我开始写代码,但有错误,我不知道为什么! 代码:

  • 我试图理解使用中给出的递归对堆栈元素进行排序http://www.geeksforgeeks.org/sort-a-stack-using-recursion/不允许使用while、for…等任何循环结构。我们只能在堆栈S上使用以下ADT函数: is_empty(S):测试堆栈是否为空。 push(S) :向堆栈添加新元素。 Pop(S):从堆栈中删除顶部元素。 top(S) :返回 top 元素

  • 问题内容: 内核堆栈和用户堆栈有什么区别?为什么要使用内核堆栈?如果在ISR中声明了局部变量,它将存储在哪里?每个进程都有自己的内核堆栈吗?那么,进程如何在这两个堆栈之间进行协调? 问题答案: 内核堆栈和用户堆栈有什么区别? 简而言之,除了在内存中使用不同的位置(并因此为堆栈指针寄存器使用不同的值)之外,什么也没有,而且通常使用不同的内存访问保护。也就是说,在用户模式下执行时,即使映射了内核内存(