3.1 Describe how you could use a single array to implement three stacks.
如果维护2个stack还可以左边一个,右边一个,现在维护3个啊!焚蛋,肿么办?!
答案里面说可以改数组,数组里面的每个node保留着当前stack的上一个index。这样每次push的时候,顺序的在数组里面放就可以了。
还有一个很大的问题就是pop,当有stack pop的时候,就会有一些unused space,并且是分散的。为了解决这个问题,可以维护一个available space. 个人认为这个space可以用一个queue来维护,初始化就是原始数组。
但是感觉这个题目真没什么意思呀,如果再加一个queue的话,仅仅为了维护一个栈,很不值。。。可能就是为了出题目而出的吧。。。算法也没什么,就是个实现题。
struct StackNode {
int val;
int preIdx;
StackNode(int v, int p): val(v), preIdx(p){}
};
class MultiStack {
int stackSize;
vector<int> p;
vector<StackNode> buffer;
queue<int> free_space;
public:
MultiStack(int size){
stackSize = size;
p.assign(3, -1);
for (int i = 0; i < size; i++) {
free_space.push(i);
buffer.push_back(StackNode(0,0));
}
}
bool push(int stackNum, int val){
if (free_space.empty()) {
return false;
}
int idx = free_space.front();
free_space.pop();
buffer[idx].val = val;
buffer[idx].preIdx = p[stackNum];
p[stackNum] = idx;
return true;
}
pair<bool, int> pop(int stackNum){
if (isEmpty(stackNum)) {
return pair<bool, int>(false,-1);
}
int ret = buffer[p[stackNum]].val;
free_space.push(p[stackNum]);
p[stackNum] = buffer[p[stackNum]].preIdx;
return pair<bool, int>(true, ret);
}
bool isEmpty(int stackNum){
return p[stackNum] == -1;
}
};