三合一。描述如何只用一个数组来实现三个栈。
你应该实现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)
链接:三合一