题目描述
描述:三合一。描述如何只用一个数组来实现三个栈。
你应该实现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 <= stackNum <= 2
解题思路
思路1:最直观的想法是,用一个长度为3的二维数组表示三个栈,每个栈的长度为初始化的stackSize,使用一个长度为3的一维数组表示三个栈的栈顶指针,其标记栈顶元素的下一个位置。其余就和普通栈操作差不多咯!
vector<vector<int>> st=vector<vector<int>>(3); // 二维数组表示三个栈
int pos[3]={0}; // 栈顶指针表示栈顶元素的下一个
int stSize; // 栈大小
TripleInOne(int stackSize) {
stSize=stackSize;
for(int i=0;i<st.size();i++)
st[i].resize(stSize);
}
void push(int stackNum, int value) {
int curpos=pos[stackNum];
// curpos=stSize表示栈满
if(curpos<stSize)
{
st[stackNum][pos[stackNum]]=value;
pos[stackNum]++;
}
}
int pop(int stackNum) {
int curpos=pos[stackNum];
int res;
// 当栈不为空
if(curpos>0&&curpos<=stSize)
{
pos[stackNum]--;
res=st[stackNum][pos[stackNum]];
return res;
}
// 操作失败返回-1
return -1;
}
int peek(int stackNum) {
int curpos=pos[stackNum];
int res;
// 当栈不为空
if(curpos>0&&curpos<=stSize)
{
res=st[stackNum][pos[stackNum]-1];
return res;
}
// 操作失败返回-1
return -1;
}
bool isEmpty(int stackNum) {
int curpos=pos[stackNum];
if(curpos==0)
return true;
return false;
}
思路2:用一个长度为stackSize*3的一维数组表示三个栈,以stackSize和当前为第几个栈来划分三个栈,同样使用一个长度为3的一维数组表示三个栈的栈顶指针,其标记栈顶元素的下一个位置。其余就和普通栈操作差不多咯!
vector<int> st;
int pos[3];
int stSize;
TripleInOne(int stackSize) {
stSize=stackSize;
st.resize(3*stSize);
pos[0]=0;
pos[1]=stSize;
pos[2]=stSize*2;
}
void push(int stackNum, int value) {
int curpos=pos[stackNum];
// 栈未满
if(curpos<(stackNum+1)*stSize)
{
st[curpos]=value;
pos[stackNum]++;
}
}
int pop(int stackNum) {
int curpos=pos[stackNum];
int res;
// 栈非空
if(curpos>stackNum*stSize&&curpos<=(stackNum+1)*stSize)
{
pos[stackNum]--;
res=st[pos[stackNum]];
return res;
}
return -1;
}
int peek(int stackNum) {
int curpos=pos[stackNum];
int res;
// 栈非空
if(curpos>stackNum*stSize&&curpos<=(stackNum+1)*stSize)
{
res=st[pos[stackNum]-1];
return res;
}
return -1;
}
bool isEmpty(int stackNum) {
int curpos=pos[stackNum];
if(curpos==stackNum*stSize)
return true;
return false;
}
总结:第一眼,哎,怎么都读不懂题目示例意思啊!题目要求用一个数组实现三个栈,我一开始还在想,该如何实现呢?用vector啊!该如何划分栈边界呢?用栈大小啊!注意在手动模拟的过程中注意边界条件喔!
输入:
["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 [1] 表示三个栈的大小 返回值为null
// push [0, 1] 表示向第一个栈压入元素1 返回值为null
// push [0, 2] 表示向第一个栈压入元素2 返回值为null
// pop [0] 表示从第一个栈弹出元素 返回值为1
// pop [0] 表示从第一个栈弹出元素 由于第一个栈没有元素 返回值为-1
// pop [0] 表示从第一个栈弹出元素 由于第一个栈没有元素 返回值为-1
// isEmpty [0] 表示判断第一个栈是否为空 返回值true表示为空