Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
三合一。描述如何只用一个数组来实现三个栈。
你应该实现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]
提示
- 0 <= stackNum <= 2
二、思路分析:
这题一开始我没看懂题目表达的什么意思,我打开评论区看到了许多和我一样没看懂题目意思的同学,这里解释一下题意:
题目意思是使用数组实现栈,并且把3个栈使用一个数组来表示(三合一)。stackNum代表操作第几个栈,stackSize代表每个栈的大小。
结题说明:
- 初始化数组
需要一个创建和初始化一个数组,数组的大小为给定参数stackSize的3倍,因为是3个栈。需要一个数组top来记录每个栈的头指针
其中下标0、1、2分别代表栈0,栈1,栈2的头指针,也就是下一个元素插入的下标。
- push方法
有两个参数,第一个参数代表操作哪一个栈,第二个元素代表插入的值。首先要判断栈是否满了,满了就不往栈里push元素,没有满的话往头指针下标插入值。头指针增加3。
- pop方法
pop方法是取出栈顶元素,判断是否为空,为空返回-1,栈顶元素的下标为top记录下标减去,因为在push元素时top下标向后移动了3,同时栈顶元素取出后top指针下标也要减去3。
- peek方法
peek方法与pop不同的是只返回栈顶元素并不将栈顶元素弹出,所以省去top指针的移动即可。
- isEmpty方法
如果top指针减去3小于0代表该栈已经为空了。
三、AC 代码:
class TripleInOne {
int[] arr;
int[] top; //头指针数组
public TripleInOne(int stackSize) {
arr = new int[stackSize * 3];
top = new int[3];
top[0] = 0;
top[1] = 1;
top[2] = 2;
}
public void push(int stackNum, int value) {
if(top[stackNum] < arr.length){
arr[top[stackNum]] = value;
top[stackNum] += 3;
}
}
public int pop(int stackNum) {
if(this.isEmpty(stackNum)){
return -1;
}
top[stackNum] = top[stackNum] - 3;
return arr[top[stackNum]];
}
public int peek(int stackNum) {
if(this.isEmpty(stackNum)){
return -1;
}
return arr[top[stackNum]-3];
}
public boolean isEmpty(int stackNum) {
return top[stackNum] - 3 < 0;
}
}
/**
* Your TripleInOne object will be instantiated and called as such:
* TripleInOne obj = new TripleInOne(stackSize);
* obj.push(stackNum,value);
* int param_2 = obj.pop(stackNum);
* int param_3 = obj.peek(stackNum);
* boolean param_4 = obj.isEmpty(stackNum);
*/
总结
本题主要考察了栈,Java中栈的底层实现其中一种就是动态数组。