// ННГУ, ВМК, Курс "Методы программирования-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); } /*---------------------------------------------*/