多个堆栈共享连续个存储空间

多个堆栈共享连续个存储空间

分析

  • 由于堆栈是一个动态结构,一般使用顺序存储的时候用数组来实现,而数组是静态结构,这就使得存储空间大大的浪费。
  • 为了使空间的充分利用,将多个堆栈顺序的映射到一个已知大小为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).

猜你喜欢

转载自blog.csdn.net/honeylife/article/details/99675829