{$mode objfpc} unit stunit; interface type TAbstractStack=class protected procedure _pop(var adata; len:integer);virtual;abstract; procedure _push(var adata; len:integer);virtual;abstract; function _empty:boolean;virtual;abstract; function _typeData:integer;virtual;abstract; public property empty:boolean read _empty; property typeData:integer read _typeData; // тип элемента на вершине стека, 0 - неопределено или пусто, 1 - Integer, 2 - extended, 3 - shortstring procedure pushInt(avalue:integer); function popInt:integer; procedure pushFloat(avalue:Extended); function popFloat:Extended; procedure pushString(avalue:ShortString); function popString:ShortString; end; TMemoryStack=class(TAbstractStack) private stack:array[1..1024] of byte; sp:integer; protected procedure _pop(var adata; len:integer);override; procedure _push(var adata; len:integer);override; function _empty:boolean;override; function _typeData:integer;override; end; { TFileStack=class(TAbstractStack) protected procedure _pop(var adata; len:integer);override; procedure _push(var adata; len:integer);override; function _empty:boolean;override; function _typeData:integer;override; end; } implementation uses sysutils; // Реализация методов TAbstractStack procedure TAbstractStack.pushInt(avalue:integer); var tp:integer; begin _push(avalue,sizeof(avalue)); tp:=1; _push(tp,sizeof(tp)); end; function TAbstractStack.popInt:integer; var tp:integer; begin if empty then raise Exception.Create('Стек ПУСТ!'); // writeln((self as tmemorystack).sp); _pop(tp,sizeof(tp)); // writeln((self as tmemorystack).sp); // writeln(tp); if tp<>1 then raise Exception.Create('Ожидается целочисленный тип на вершине стека!'); _pop(result,sizeof(result)); end; procedure TAbstractStack.pushFloat(avalue:Extended); begin end; function TAbstractStack.popFloat:Extended; begin result:=0; end; procedure TAbstractStack.pushString(avalue:ShortString); begin end; function TAbstractStack.popString:ShortString; begin result:=''; end; // Реализация методов TMemoryStack procedure TMemoryStack._pop(var adata; len:integer); var i:integer; begin // for i:=1 to 8 do write(stack[i], ' '); // writeln; // writeln(sp,' ',len); move(stack[sp-len+1],adata,len); dec(sp,len); // writeln(sp,' ',integer(adata)); end; procedure TMemoryStack._push(var adata; len:integer); begin move(adata,stack[sp+1],len); inc(sp,len); end; function TMemoryStack._empty:boolean; begin result:=sp=0; //if sp=0 then result:=true else result:=false; end; function TMemoryStack._typeData:integer; begin _pop(result,sizeof(result)); _push(result,sizeof(result)); end; // Реализация методов TFileStack end.