力扣题解:面试题 03.01. 三合一:只使用一个数组实现三个栈

题目

三合一。描述如何只用一个数组来实现三个栈。
你应该实现push(stackNum, value)、pop(stackNum)、isEmpty(stackNum)、peek(stackNum)方法。stackNum表示栈下标,value表示压入的值。
构造函数会传入一个stackSize参数,代表每个栈的大小。

解题思路

一个数组保存3个栈的值

  • stack1: values[0], values[3], values[6]…
  • stack2: values[1], values[4], values[7]…
  • stack3: values[2], values[5], values[8]…

代码

class TripleInOne {
  // 3个栈的值
  // stack1:[0,3,6...] , stack2:[1,4,7...] , stack3:[2,5,8...]
  private Integer[] values;
  // 3个栈的当前索引
  private Integer[] indexes;

  public TripleInOne(int stackSize) {
    values = new Integer[stackSize * 3];
    indexes = new Integer[3];
  }

  public void push(int stackNum, int value) {
    int index = indexes[stackNum] != null ? indexes[stackNum] + 3 : stackNum;
    // 栈不满的时候value入栈,否则舍弃
    if (index < values.length) {
      // 保存值
      values[index] = value;
      // 保存索引
      indexes[stackNum] = index;
    }
  }

  public int pop(int stackNum) {
    if (isEmpty(stackNum)) return -1;
    int index = indexes[stackNum];
    int num = values[index];
    // 出栈后清理value及index
    values[index] = null;
    indexes[stackNum] = index < 3 ? null : index - 3;
    return num;
  }

  public int peek(int stackNum) {
    return isEmpty(stackNum) ? -1 : values[indexes[stackNum]];
  }

  public boolean isEmpty(int stackNum) {
    return indexes[stackNum] == null;
  }
}

题目来源:力扣(LeetCode)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡矣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值