leetcode 链接:三合一
题目
描述如何只用一个数组来实现三个栈。
- 你应该实现
push(stackNum, value)
、pop(stackNum)
、isEmpty(stackNum)
、peek(stackNum)
方法。stackNum
表示栈下标,value
表示压入的值。 - 构造函数会传入一个
stackSize
参数,代表每个栈的大小。
示例:
输入:
["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`不压入元素。
输入:
["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、栈1、栈2
class TripleInOne {
private:
int* arr; //存储三个栈元素的数组
int stackSize; //每个栈的大小
int top[3]; //三个栈顶下标
public:
TripleInOne(int stackSize) { //构造函数
this->stackSize = stackSize;
arr = new int[stackSize * 3];
for(int i = 0; i < 3; ++i)
top[i] = -1;
}
void push(int stackNum, int value) { //入栈函数
if(top[stackNum] < stackSize - 1)
{
++top[stackNum];
arr[stackNum * stackSize + top[stackNum]] = value;
}
}
int pop(int stackNum) { //出栈函数
if(top[stackNum] > -1)
{
int topVal = arr[stackNum * stackSize + top[stackNum]];
--top[stackNum];
return topVal;
}
else
return -1;
}
int peek(int stackNum) { //取栈顶函数
if(top[stackNum] > -1)
{
return arr[stackNum * stackSize + top[stackNum]];
}
else
return -1;
}
bool isEmpty(int stackNum) { //判断栈是否为空
return top[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);
*/
执行结果:
执行结果:通过
执行用时:88 ms, 在所有 C++ 提交中击败了 32.43% 的用户
内存消耗:32.1 MB, 在所有 C++ 提交中击败了 89.49% 的用户