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

叠中元素

闻人志
2023-03-14

我在geeksforgeeks网站上读到了关于用javascript和python实现堆栈的文章。我在javascript中实现了删除堆栈中的中间元素的代码,就像在同一个网站中为python提供的代码一样。但我答错了。为什么会这样?这两种语言在这种情况下有什么不同?如何在JavaScript中得到正确答案?下面是JavaScript中的代码。

js prettyprint-override">class Stack {
  constructor() {
    this.items = [];
  }

  push(element) {
    this.items.push(element);
  }

  pop() {
    if (this.items.length === 0) {
      return "Underflow";
    } else {
      return this.items.pop();
    }
  }

  peek() {
    return this.items[this.items.length - 1];
  }

  isEmpty() {
    return this.items.length == 0;
  }
  print() {
    console.log(this.items);
  }
}

function deleteMid(stack, curr) {

  // If stack is empty or all items 
  // are traversed 

  if (stack.isEmpty() || curr == stack.items.length) {
    return;
  }
  // Remove last item
  x = stack.peek();
  stack.pop();

  // Remove other items 
  deleteMid(stack, curr + 1);
  console.log("length value: ", stack.items.length);

  // Put all items back except middle 
  if (curr != Math.floor(stack.length / 2)) {
    stack.push(x);
  }
}

var stack = new Stack();
stack.push(1);
stack.push(2);
stack.push(3);
stack.print();
deleteMid(stack, 0);
stack.print();

共有1个答案

解修然
2023-03-14

您的实现遗漏了Python实现的某些部分:

您有一个隐式的全局X变量--与Python不同的是,在Javascript中,没有var/let/const声明的变量被分配给全局对象,因此一旦递归的deletemid完成,您每次都只重新分配了一个名为X的变量(而不是每次迭代都重新分配一个)。改为使用const x,以确保deletemid的每个调用都有自己的x绑定。

您的堆栈没有length属性,因此curr!=math.flola(stack.length/2)测试结果为curr!=nan-这不是您所希望的。尽管可以为堆栈赋予长度getter属性:

  get length() {
    return this.items.length;
  }

这仍然不符合Python实现的要求,它会不断递归地传递初始长度,作为另一个参数:如果您想模仿Python实现,也可以使用n变量:

function deleteMid(stack, n, curr) {
  // ...
  // Remove other items 
  deleteMid(stack, n, curr + 1);
  // Put all items back except middle 
  if (curr != Math.floor(n / 2)) {
  // ...
// Call with:
deleteMid(stack, stack.items.length, 0);

检查length属性的问题是,它会在迭代过程中发生更改,这将使工作变得更加困难。

出于同样的原因,为了使即使大小的堆栈也能工作,我们还需要在这里更改您的JS测试:

if (stack.isEmpty() || curr == stack.items.length) {
if (st.isEmpty() or curr == n) :
class Stack {
  constructor() {
    this.items = [];
  }

  push(element) {
    this.items.push(element);
  }

  pop() {
    if (this.items.length === 0) {
      return "Underflow";
    } else {
      return this.items.pop();
    }
  }

  peek() {
    return this.items[this.items.length - 1];
  }

  isEmpty() {
    return this.items.length == 0;
  }
  print() {
    console.log(this.items);
  }
  get length() {
    return this.items.length;
  }
}

function deleteMid(stack, n, curr) {

  // If stack is empty or all items 
  // are traversed 

  if (stack.isEmpty() || curr === n) {
    return;
  }
  // Remove last item
  const x = stack.peek();
  stack.pop();

  // Remove other items 
  deleteMid(stack, n, curr + 1);

  // Put all items back except middle 
  if (curr != Math.floor((n) / 2)) {
    stack.push(x);
  }
}

var stack = new Stack();
stack.push(1);
stack.push(2);
stack.push(3);
stack.print();
deleteMid(stack, stack.items.length, 0);
stack.print();
 类似资料:
  • 我有一个SVG元素,它包含两个尺寸和位置完全相同的子元素。两者唯一的区别是它们的颜色:第一个是红色,第二个是绿色。我注意到,即使绿色的圆圈在红色的上面,你仍然可以看到在圆圈的边缘有一点颜色偏移。我有什么办法可以避免这种颜色的变化吗? 下面是一张屏幕截图,显示了有红圈和没有红圈的情况: 这里还有我用来复制这个的小提琴。 null 欢迎任何不同的想法。

  • 通常我们可能会认为 HTML 网页是个二维的平面,因为页面中的文本、图像或者其它元素都是按照一定顺序排列在页面上的,每个元素之间都有一定的间隙,不会重叠。然而,实际的网页其实是三维的,元素之间可能会发生堆叠(重叠),您可以通过 CSS 中的 z-index 属性来设置元素的堆叠顺序,如下图所示: 图:元素堆叠演示 每个元素都有一个默认的 z-index 属性,将 z-index 属性与 posit

  • 我正在创建一个导航栏,如下所示。 我想实现的主要功能有: 点击汉堡按钮时显示侧边栏。 在菜单上悬停时显示下拉列表。当指针离开下拉列表或菜单时,下拉列表应该被隐藏。 我的问题是: 显示时,菜单列表似乎出现在侧边栏的前面。我希望侧边栏位于菜单和绿色标题div的前面,但仍位于最顶端的导航栏(带有徽标的导航栏)的后面。我把它们叠错了吗 下拉列表根本不显示。我曾经尝试过做很多事情,直到我将鼠标悬停在菜单上时

  • 堆叠的或者移动到其他元素前面的小部件(Widgets)当放置到现实世界的页面中时经常面临挑战。通常通过简单地改变堆叠元素的 z-index 或者父元素来避免页面上的冲突。但是,jQuery UI 需要一个不需要手动改变 z-index 值的通用的解决方案。这是通过 ui-front class 来完成的,通常还伴随着堆叠组件上的 appendTo 选项。 ui-front class ui-fro

  • 本文向大家介绍说说元素上下层叠关系及七阶层叠关系相关面试题,主要包含被问及说说元素上下层叠关系及七阶层叠关系时的应答技巧和注意事项,需要的朋友参考一下

  • 问题内容: 这是我写的: 但是对于每个领域我都有价值。我想使用三元运算符,而不是因为我想尝试一下,看看它会如何完成。 此代码有什么问题? 问题答案: 其他人已经提出了正确的方法,但是如果您真的想使用三元运算符,则需要使用括号: