题目
三合一。描述如何只用一个数组来实现三个栈。
你应该实现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;
}
}