所以我尝试了我的方法,但没有成功,而且似乎有太多的控制语句,这让人有些困惑这个问题是不言而喻的。
如何使用一个数组实现三个堆栈?
我知道答案是用java来回答的,但是在javascript中找不到任何东西。
目前,一个潜在的解决方案,有固定的空间量为每个堆栈将是好的我知道一种在空间分配上更灵活的解决方案也会更加复杂。
谢谢你的帮助:)
编辑:这是我的代码

function ThreeInOne() {
  this.stack = [];
  this.firstStackBeginning;
  this.firstStackEnd;
  this.secondStackBeginning;
  this.secondStackEnd;
  this.thirdStackBeginning;
  this.thirdStackEnd;

  this.addAtStack = function(stackIndex, value) { 
    if (this.stack.length === 0) {
      this.stack.push(value);
      if (stackIndex = 1) {
        this.firstStackBeginning = 0;
        this.firstStackEnd = 0;
      } else if (stackIndex = 2) {
        this.secondStackBeginning = 0;
        this.secondStackEnd = 0;
      } else if (stackIndex = 3) {
        this.thirdStackBeginning = 0;
        this.thirdStackEnd = 0;
      } else if (stackIndex > 3) {
        console.log("There are only 3 stacks available to add to")
      }
    } else if (this.stack.length > 0) {
      if (stackIndex == 1) {
        if (this.secondStackBeginning == 0) {
          this.stack.unshift(value);
          this.secondStackBeginning++;
          this.secondStackEnd++;
          this.firstStackBeginning = 0;
          this.firstStackEnd = 0;
        }
        if (this.secondStackBeginning && this.secondStackBeginning !== 0) {
          this.stack.splice(this.secondStackBeginning-1, 0, value);
          this.firstStackEnd++;
        }
      } else if (stackIndex == 2) {
        if (this.thirdStackBeginning==0) {
          this.stack.unshift(value);
          this.thirdStackBeginning++;
          this.thirdStackEnd++;
          this.secondStackBeginning = 0;
          this.secondStackEnd = 0;
        } else if (this.thirdStackBeginning != 0) {
          this.stack.splice(this.thirdStackBeginning-1, 0, value);
          this.secondStackEnd = this.thirdStackBeginning-1;
          this.thirdStackBeginning++;
          this.thirdStackEnd++;
        }
      } else if (stackIndex == 3) {
        if (this.firstStackEnd && !this.secondStackEnd && !this.thirdStackBeginning) {
          this.thirdStackBeginning = this.firstStackEnd+1;
          this.stack.push(value);
        } else if (this.seconStackEnd )
      }
    }
  }
}

它还没有完成,但想法是保留每个堆栈开始和结束的指针,并相应地更新它们我认为重点是不要使用另一个数据结构(除了一个数组),否则我只需要创建一个包含三个内部数组的数组并相应地更新它们例如,如果我们从array=[4,5,1,2,0,3,6]开始,这个数组实际上由三个堆栈组成,一个是[4,5],两个是[1,2],三个是[0,3,6]。我的想法是,如果我想将x添加到堆栈2,那么我将得到数组=[4,5,1,2,x,0,3,6]
我希望这能更清楚些!

最佳答案

这个问题在JS中是微不足道的,即使只有一个数组,所以看起来有点不符合问题的本质原因是js数组将自动扩展以添加元素,使它们比java中的arraylists或基元数组更易于使用。
一种方法可能涉及映射到数组中偏移量的每个堆栈例如,在三堆栈配置中,第一个堆栈从索引0开始,并使用元素0、3、6、9等。第二个堆栈从索引1开始,使用索引1、4、7、10等。在一个顶部操作中,数组的索引使用公式i + n * (sizes[i] - 1),而推一个新的顶部是i + n * sizes[i],其中i是堆栈ID号,n是构造函数中指定的堆栈数。

class NStack {
  constructor(n) {
    this.stacks = [];
    this.sizes = new Array(n).fill(0);
  }

  peek(i) {
    return this.stacks[i+(this.sizes[i]-1)*this.sizes.length];
  }

  pop(i) {
    if (this.sizes[i] > 0) {
      return this.stacks.splice(
        i + (--this.sizes[i]) * this.sizes.length, 1, null
      );
    }
  }

  push(i, elem) {
    if (this.sizes[i] >= 0) {
      this.stacks[i+(this.sizes[i]++)*this.sizes.length] = elem;
    }
  }
}

const tripleStack = new NStack(3);
tripleStack.push(0, "banana");
console.log(tripleStack);
tripleStack.push(2, "apple");
console.log(tripleStack);
tripleStack.push(1, "watermelon");
console.log(tripleStack);
tripleStack.push(2, "jackfruit");
console.log(tripleStack);
tripleStack.pop(0);
console.log(tripleStack);
tripleStack.pop(2);
console.log(tripleStack);
console.log(tripleStack.peek(0));
console.log(tripleStack.peek(1));
console.log(tripleStack.peek(2));

关于javascript - Javascript:如何使用单个数组实现三个堆栈?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52392984/

10-09 17:47
查看更多