Three in One:使用一个数组实现3个栈。
书上给了两种方法,一种固定每个栈的大小,另外一种动态改变栈的大小。动态改变栈大小时,3个栈的总大小不变,但是每个栈可以根据元素数量动态使用其它栈的空间。力扣上的明确指出push操作遇到栈满时不压入元素,所以动态的方法也没啥用了。
固定大小的方法中,使用StackInfo记录栈底和栈顶,top为栈顶元素的下一个位置。
class TripleInOne {
private:
struct StackInfo
{
int base;
int top;
};
int size;
int* piTripleStack;
StackInfo* pSI;
public:
TripleInOne(int stackSize) : size(stackSize), piTripleStack(nullptr), pSI(nullptr)
{
piTripleStack = new int[3 * size];
pSI = new StackInfo[3];
for(int i = 0; i < 3; i++)
{
pSI[i].base = i * size;
pSI[i].top = i * size;
}
}
~TripleInOne()
{
delete [] piTripleStack;
delete [] pSI;
}
void push(int stackNum, int value) {
if(pSI[stackNum].top - pSI[stackNum].base == size) return;
else piTripleStack[pSI[stackNum].top++] = value;
}
int pop(int stackNum) {
if(isEmpty(stackNum)) return -1;
else return piTripleStack[--pSI[stackNum].top];
}
int peek(int stackNum) {
if(isEmpty(stackNum)) return -1;
else return piTripleStack[pSI[stackNum].top - 1];
}
bool isEmpty(int stackNum) {
return pSI[stackNum].top == pSI[stackNum].base;
}
};
/**
* 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);
*/

被折叠的 条评论
为什么被折叠?



