function one dance stack



Автор Ёолнышко)) задал вопрос в разделе Другие языки и технологии

Реализовать в Delphi организацию работы СТЕКА. и получил лучший ответ

Ответ от Nanaki[гуру]
Ну как минимум стараться передавать в процедуры и функции не переменные а указатели на них... в качестве параметров
P.S: Подумал "Реализовать в Delphi правильную организацию работы СТЕКА"

Ответ от Ѐодион Казанин[гуру]
ну прямо заинтриговала, ведьт стек стеку рознь. в нем, например можно хранить разные типы данных
у них (стеков) одно общее правило:
первым зашел - последним вышел
или
последним зашел - первым вышел.
к примеру объяви структуру Tstrings и пользуйся ей как стеком
почитай форум : может быть поможет

Ответ от Sui Caedere[гуру]
Простенькая организация на основе массива (в качестве примера стэк из integer)
interface
type
Stack_Integer = class
private
fStack: array of integer; {или другой тип}
fPos: integer;
fSize: integer;
public
constructor Create;
procedure Put(X: integer); {или другой тип}
function Get: integer; {или другой тип}
function Count: integer;
end;
implementation
constructor Stack_Integer.Create;
begin
fPos := 0;
fSize := 4;
SetLength(fStack, fSize);
end;
function Stack_Integer.Get: integer;
begin
Result := 0;
if fPos = 0 then Exit;
Dec(fPos);
Result := fStack[fPos];
end;
procedure Stack_Integer.Put(X: integer);
begin
if fPos = fSize then begin
fSize := fSize * 2;
SetLength(fStack, fSize);
end;
fStack[fPos] := X;
Inc(fPos);
end;
function Stack_Integer.Count: integer;
begin
Result := fPos;
end;

Ответ от Alaksiej Safonaŭ[гуру]
Итак предлагаю два варианта базовой структуры:
-список
interface
type
PMyNode = ^TMyNode;
TMyNode = record
Data : Pointer;
Next : PMyNode;
end;
TMyStack = class
public
constructor Create;
destructor Destroy;
function Push( Data: Pointer ): Pointer;
function Pop: Pointer;
property Count: Integer read FCount;
private
TMyNode: Head;
FCount: Integer;
end;
implemenation
constructor TMyStack.Create;
begin
inherited Create;
Head.Next := Nil;
FCount := 0;
end;
destructor TMyStack.Destroy;
begin
while ( Count > 0 ) Pop;
inherited Destroy;
end;
function TMyStack.Push( Data: Pointer ): Pointer;
var
Tmp: PMyNode;
begin
New( Tmp );
Result := Data;
Tmp^.Data := Data;
Tmp^.Next := Head.Next;
Head.Next := Tmp;
Inc( FCount );
end;
function TMyStack.Pop: PMyNode;
var
Tmp: PMyNode;
begin
Result := Nil;
if ( Count = 0 ) Exit;
Tmp := Head.Next;
Result := Tmp^.Data;
Dispose( Tmp );
Dec( FCount );
end;
-Массив
interface
type
TMyStack = classpublic
constructor Create;
destructor Destroy;
function Push( Data: Pointer ): Pointer;
function Pop: Pointer;
property Count: Integer read FCount;
private
St: array of Pointer;
StLen: Integer;
FCount: Integer;
end;
implemenation
const
c_BaseLen = 8;
constructor TMyStack.Create;
begin
inherited Create;
StLen := c_BaseLen;
SetLength( St, StLen );
FCount := 0;
end;
destructor TMyStack.Destroy;
begin
Finalize( St );
inherited Destroy;
end;
function TMyStack.Push( Data: Pointer ): Pointer;
begin
Result := Data;
St[ FCount ] := Data;
Inc( FCount );
if ( FCount >= StLen ) then begin
Inc( StLen, StLen );
{ У меня сейчас нет доступа к Дельфи, проверьте, копирует ли SetLength предыдущее содержимое массива и если нет, то сделайте это здесь сами с использованием Tmp: array of Pointer и Move(...)}
SetLength( St, StLen);
end;
end;
function TMyStack.Pop: PMyNode;
begin
Result := Nil;
if ( Count = 0 ) Exit;
Dec( FCount );
Result := St[ FCount ];
end;
Дополнительно показываю вариант function Push( Data: Pointer ): Pointer; если окажется, что SetLength не копирует содержимое массива, которое было там до того:
function TMyStack.Push( Data: Pointer ): Pointer;
var
Tmp: array of Pointer;
begin
Result := Data;
St[ FCount ] := Data;
Inc( FCount );
if ( FCount >= StLen ) then begin
SetLength( Tmp, StLen);
Move( St, Tmp, StLen );
SetLength( St, 2 * StLen);
Move( Tmp, St, StLen );
Inc( StLen, StLen );
end;
end;
Тип данных Pointer предложен из соображений универсальности обращение к стеку будет выглядеть следующим образом (считается что stack - созданный объект класса TMyStack, вне зависимости от реализации) :
var
Tmp: <указатель на ваш тип данных>;
begin
New( Tmp );
{каким-либо образом инициализируете ваши данные}
stack.Push( Tmp );
end;
Момент извлечения
var
Tmp: <указатель на ваш тип данных>;
begin
Tmp := stack.Pop;
{каким-либо образом используете ваши данные}
Dispose( Tmp );
end;

Ответ от 3 ответа[гуру]
Привет! Вот подборка тем с похожими вопросами и ответами на Ваш вопрос: Реализовать в Delphi организацию работы СТЕКА.
 

Ответить на вопрос:

Имя*

E-mail:*

Текст ответа:*
Проверочный код(введите 22):*