複数のスタックが連続したストレージスペースを共有します
分析
- スタックは動的構造であるため、通常、シーケンシャルストレージを使用する場合は配列を使用して実装されます。また、配列は静的構造であり、ストレージスペースを大幅に浪費します。
- スペースを最大限に活用するために、複数のスタックが既知のサイズ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)です。