// ННГУ, ВМК, Курс "Методы программирования-2", С++, ООП
//
// Copyright (c) Гергель В.П. 31.07.2000
//
// Динамические структуры данных - система N стеков

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include "multist.h"
#include "datqueue.h"

TMultiStack :: TMultiStack () {
  int StackSize = MemLimit / StackNum;
  for ( int i=0, pos=0; i<=StackNum; i++, pos+=StackSize ) {
    pStack[i] = new TStack(0);
    if ( i==StackNum-1 ) pStack[i]->SetMem ( &Mem[pos], MemLimit-pos );
    if ( i==StackNum   ) pStack[i]->SetMem ( &Mem[MemLimit], 0 );
    else pStack[i]->SetMem ( &Mem[pos], StackSize );
  }
  RelocationCount = 0;
  FreeMemSize = MemLimit;
  RetCode     = DataOK;
}
              /*---------------------------------------------*/

TMultiStack :: ~TMultiStack () {
  for ( int i=0; i<=StackNum; i++ )
    delete pStack[i];
}
              /*---------------------------------------------*/

int TMultiStack :: IsEmpty ( int ns ) const { // контроль пустоты СД
  return pStack[ns]->IsEmpty();
}
	      /*---------------------------------------------*/

int TMultiStack :: IsFull ( int ns ) const { // контроль переполнения СД
  return FreeMemSize==0;
}
		/*---------------------------------------------*/

void TMultiStack :: Put ( int ns, const TData &Val ) { // положить в стек


Skipped...

} // Put
		/*---------------------------------------------*/

TData TMultiStack :: Get ( int ns ) { // взять из стека с удалением
  TData temp = pStack[ns]->Get();
  int  Code = pStack[ns]->GetRetCode();
  if ( Code == DataOK ) FreeMemSize++;
  SetRetCode ( Code );
  return temp;
} // Get
		/*---------------------------------------------*/

int TMultiStack :: GetFreeMemSize (void) { // оценка объема свободной памяти
  FreeMemSize = 0;
  for ( int i=0; i < StackNum; i++ ) {
    FreeMemSize += pStack[i]->MemSize - pStack[i]->DataCount;
  }
  return FreeMemSize;
}
		/*---------------------------------------------*/
void TMultiStack :: SetStackLocation ( TElem *pStackMem[] ) {
// оценка новых значений для базовых адресов памяти стеков
// стратегия "всем поровну"
  pStackMem[0] = &Mem[0];
  for ( int i=1; i < StackNum; i++ )
    pStackMem[i] = pStackMem[i-1] + pStack[i-1]->DataCount + FreeMemSize / StackNum;
  pStackMem[StackNum] = pStack[StackNum]->pMem;
}
		/*---------------------------------------------*/

int TMultiStack :: StackRelocation ( int nst ) { // перепаковка стеков


Skipped...

}
		/*---------------------------------------------*/

void TMultiStack :: Paint(int y,int x1,int x2) { // показать рисунок структуры
  int FieldSize = ( x2 - x1 + 1 ) / StackNum;
  for ( int i=0, px=x1; i < StackNum; i++, px+=FieldSize )
    pStack[i]->Paint(y,px,px+FieldSize-1);
}
		/*---------------------------------------------*/
Хостинг от uCoz