多个堆栈共享连续个存储空间
分析
- 由于堆栈是一个动态结构,一般使用顺序存储的时候用数组来实现,而数组是静态结构,这就使得存储空间大大的浪费。
- 为了使空间的充分利用,将多个堆栈顺序的映射到一个已知大小为M的存储空间STACK[0…M-1]中。
假设有两个堆栈共享这M个存储空间,这种的比较简单
- 只要让第一个栈的栈底位于STACK[0]处,
- 第二个栈的栈底位于STACK[M-1]处。
假设堆栈n>2 这时候如何分配了。
- 先将M个存储空间平分个n个堆栈,
- 每个堆栈占用M/n个存储空间(最后一个可能多或少)
- 当其中一个产生溢出时,而整个空间并未占满时,则进行“浮动”的调整。
设计
将item插入第i个堆栈(i=1,2)
// 插入
int PUSH2(int STACK[],int top [],int i,int item){
if(top[0]==top[1]-1){ // 表示堆栈已满,没法插入
return 0;
}else {
if(i==1) top[0]++;
else top[1]--;
STACK[top[i-1]]=item;
return 1;
}
}
删除第i个栈中的栈顶元素
int POP2(int STACK[],int top[],int i,int &item){
if(i==1){
if(top[0]==-1){
return 0; // 为空
}else{
item = STACK[top[0]--];
return 1;
}
}else{
if(top[1]==M){
return 0;
}else{
item = STACK[top[1]++];
return 1;
}
}
}
显然,整个算法的时间复杂度为O(1).