堆栈中的中间元素

时间:2018-12-20 08:06:26

标签: javascript data-structures stack

我在geeksforgeeks网站上阅读了有关使用javascript和python实现堆栈实现的文章。我实现了代码,以删除javascript中堆栈中的中间元素,就像在同一网站上为python给出的一样。但是我得到了错误的答案。为什么会这样呢?在这种情况下,两种语言有什么区别?如何在javascript中获得正确答案?下面是Javascript中的代码。

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

2 个答案:

答案 0 :(得分:1)

由于您在开始时就知道中间索引,因此可以在删除每个项目后检查堆栈的长度,并在碰到中间时停止。

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, middle = Math.round(stack.items.length / 2)) {
  if (stack.isEmpty()) return;
  
  const isMiddle = stack.items.length === middle;
  
  // Remove last item
  const x = stack.pop();

  // stop when you get to the middle
  if (isMiddle) return;
  
  // Remove other items
  deleteMid(stack, middle);
  
  // add the item back
  stack.push(x);
}

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

答案 1 :(得分:1)

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

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

您的堆栈没有length属性,因此您的curr != Math.floor(stack.length/2)测试结果为curr != NaN-这不是您想要的。尽管您可以给stack一个length的getter属性:

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

这仍然不符合Python实现,该实现连续递归地传递初始长度,作为另一个参数:如果您想模仿Python实现,也可以使用{{1 }}变量:

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); 属性的问题是,它会在迭代过程中更改 ,这会使处理起来变得更加困难。

出于相同的原因,为了使即使大小的堆栈都能工作,我们还需要在此处更改您的JS测试:

length

对应于Python代码:

if (stack.isEmpty() || curr == stack.items.length) {

工作代码:

if (st.isEmpty() or curr == n) :