三合一。描述如何只用一个数组来实现三个栈。
你应该实现push(stackNum, value)、pop(stackNum)、isEmpty(stackNum)、peek(stackNum)方法。stackNum表示栈下标,value表示压入的值。
构造函数会传入一个stackSize参数,代表每个栈的大小。
示例1:
pop, peek
返回-1,当栈满时push
不压入元素。示例2:
提示:
0 <= stackNum <= 2
在你的写代码的位置,还有一段关于代码的注释,很重要,也需要你去看
// /**
// * 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);
// * bool param_4 = obj->isEmpty(stackNum);
// */
这道题虽然说是简单题,但是也会让第一次做他的人狠懵。我来带大家心平气和的来读一遍题。
首先,题目要求我们实现,将三个栈,去塞入一个数组中。然后还要求我们去设计栈的push函数,pop函数,top函数(peek)还有就是empty函数(isempty)。
不要被题目给的密密麻麻的输入输出吓到了,它们是一一对应的关系。
当整个栈为空的时候,pop函数,top函数(peek)返回-1;若不为-1,则返回栈顶元素。
若栈被塞满后,继续塞元素则直接返回。
empty函数就是让你去判断栈是否为空,若为空返回true,否则false
现在不知你是否有信心继续面对这道题了。如果有,我们继续。
现在已知每个栈的大小,题目会给你叫做:stackSize,然后一共有三个栈,相当于已知stackNum=3。
首先既然它说用一个数组去实现,那一个一维数组是一个数组,一个二维数组它也是一个数组。我们来看二维数组怎么实现的。
首先,先在创建一个二维的vector,其中的一维就是一个栈,然后栈内的元素,就是题目给的stackSize。
vector> group ;
然后再创建一个一维的vector,它一共有三个元素,分别代表三个组,然后每个元素的数值,就代表着栈内的元素下标。
vector point;
我们刚刚只是在这个类中创建了两个成员变量,我们紧接着来实现它的构造方法。
在构造方法中,我们需要给这两个vector赋予初始值。
group = group = vector>(3,vector(stackSize));
point = vector(3,-1);
说到这里,其实就不用说了吧,剩下的方法,是很好实现的,那么我现在就给整体的代码了:
代码如下:
class TripleInOne {
public:vector> group;vector point;TripleInOne(int stackSize) {group = vector>(3,vector(stackSize));point = vector(3,-1);}void push(int stackNum, int value) {if(point[stackNum]+1 == group[0].size()) return ; //栈满。无法添加元素,原地返回point[stackNum] ++;group[stackNum][point[stackNum]] = value;return ;}int pop(int stackNum) {if(point[stackNum] == -1) return -1;point[stackNum] --;return group[stackNum][point[stackNum]+1]; //根据题意,返回的是未被弹出的栈顶元素}int peek(int stackNum) {if(point[stackNum] == -1) return -1;return group[stackNum][point[stackNum]];}bool isEmpty(int stackNum) {return point[stackNum] == -1;}
};/*** 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);* bool param_4 = obj->isEmpty(stackNum);*/
一维数组法,相对与二维数组法并没有什么明显的优势,其实也是去扣代码中下标的细节。如果你觉得对数组下标的判断吃力无比,请不要担心,不止你一个人是这样。多做,多练,勤思考多总结,就好了。
class TripleInOne {
public:vector group; //用来存放压入栈中的值vector point; //用来记录下一个要压入栈的下标int stackSize; //为了可以让其他的内置函数可以用到这个变量TripleInOne(int stackSize) {this->stackSize = stackSize; //this指针指向的这个stackSize,不是传入参数stackSize,而是成员变量stackSize。意思是让成员变量 = 传入参数。group = vector(3 * stackSize,0);point = vector{0,stackSize,stackSize*2};}void push(int stackNum, int value) {if(point[stackNum] == (stackNum +1) * stackSize) return;group[point[stackNum]] = value;++point[stackNum];}int pop(int stackNum) {if(isEmpty(stackNum)) return -1;--point[stackNum];return group[point[stackNum]];}int peek(int stackNum) {if(isEmpty(stackNum)) return -1;return group[point[stackNum]-1];}bool isEmpty(int stackNum) {return point[stackNum] == stackSize * stackNum;}
};/*** 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);* bool param_4 = obj->isEmpty(stackNum);*/
这一道题,是对自己写类方法写的少的同学的一种考验。此外,还特别考验对数组下标的判断细节。写不好,可能会卡在这里思考很久。不要灰心,多练,多思考,勤总结。总会变得越来越好的。
下一篇:运维自动化之Ansible