leetcode 三合一

257 阅读1分钟

三合一。描述如何只用一个数组来实现三个栈。

你应该实现push(stackNum, value)、pop(stackNum)、isEmpty(stackNum)、peek(stackNum)方法。stackNum表示栈下标,value表示压入的值。

构造函数会传入一个stackSize参数,代表每个栈的大小。

示例1:

 输入:
["TripleInOne", "push", "push", "pop", "pop", "pop", "isEmpty"]
[[1], [0, 1], [0, 2], [0], [0], [0], [0]]
 输出:
[null, null, null, 1, -1, -1, true]
说明:当栈为空时`pop, peek`返回-1,当栈满时`push`不压入元素。

示例2:

 输入:
["TripleInOne", "push", "push", "push", "pop", "pop", "pop", "peek"]
[[2], [0, 1], [0, 2], [0, 3], [0], [0], [0], [0]]
 输出:
[null, null, null, null, 2, 1, -1, -1]

我的算法实现:

/**
 * @param {number} stackSize
 */
var TripleInOne = function (stackSize) {
  // 保存总的大小
  this.totalLen = stackSize;
  // 保存对应的栈
  this.data = [
    {
      // 每个栈都拥有数据和长度
      len: 0,
      values: new Array(stackSize),
    },
    {
      len: 0,
      values: new Array(stackSize),
    },
    {
      len: 0,
      values: new Array(stackSize),
    },
  ];
};

/**
 * @param {number} stackNum
 * @param {number} value
 * @return {void}
 */
TripleInOne.prototype.push = function (stackNum, value) {
  // 如果当前栈的长度小于总的长度,那么就入栈,否则不做处理
  if (this.totalLen > this.data[stackNum].len) {
    this.data[stackNum].values[this.data[stackNum].len++] = value;
  }
};

/**
 * @param {number} stackNum
 * @return {number}
 */
TripleInOne.prototype.pop = function (stackNum) {
  if (this.isEmpty(stackNum)) {
    return -1;
  } else {
    return this.data[stackNum].values[--this.data[stackNum].len];
  }
};

/**
 * @param {number} stackNum
 * @return {number}
 */
TripleInOne.prototype.peek = function (stackNum) {
  if (this.isEmpty(stackNum)) {
    return -1;
  } else {
    // 栈顶的元素需要进行 -1 操作
    return this.data[stackNum].values[this.data[stackNum].len - 1];
  }
};

/**
 * @param {number} stackNum
 * @return {boolean}
 */
TripleInOne.prototype.isEmpty = function (stackNum) {
  // 直接跟0进行比较
  return this.data[stackNum].len === 0;
};

也可以保存到一个数组中,只不过操作的时候逻辑稍微多一点,只不过也不影响。

来源:力扣(LeetCode)

链接:三合一