複数のスタックが連続したストレージスペースを共有します

複数のスタックが連続したストレージスペースを共有します

分析

  • スタックは動的構造であるため、通常、シーケンシャルストレージを使用する場合は配列を使用して実装されます。また、配列は静的構造であり、ストレージスペースを大幅に浪費します。
  • スペースを最大限に活用するために、複数のスタックが既知のサイズMのストレージスペースSTACK [0 ... M-1]に順次マップされます。

これらのM個のストレージスペースを共有する2つのスタックがあるとすると、この種のスタックは比較的単純です。

  • 最初のスタックの一番下をSTACK [0]に置くだけです。
  • 2番目のスタックの一番下はSTACK [M-1]にあります。

この時点でスタックn> 2がどのように割り当てられているかを想定します。

  • まず、M個のストレージスペースをn個のスタックに分割します。
  • 各スタックはM / nストレージスペースを占有します(最後のスタックは多かれ少なかれかもしれません)
  • それらの1つがオーバーフローし、スペース全体がいっぱいにならない場合、「フローティング」調整が実行されます。

設計

アイテムを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