Используя переменные типа указатель, можно построить конструкцию, близкую к фиксированным данным абстрактного типа. Предполагается, что указатель указывает на область памяти, а формат этой памяти определяется с помощью базированных переменных абстрактного типа. Используя данные абстрактного типа, пользователь определяет данные как переменную — указатель и вызывает процедуру для размещения данных и обращения к этой структуре. Для стека это может быть в виде:
declare STACK POINTER;
call STACK_INITIALIZATION(STACK);
В этом случае процедура STACK_INITIALIZATION должна быть вызвана явным образом для того, чтобы разместить стек в памяти (рис. 4.13).
Процедура STACK_INITIALIZATION должна иметь следующую структуру:
STACK_INITIALIZATION: procedure(X);
declare X POINTER;
declare 1 STACK BASED(X),
/* X – указывает на стек */
2 ENTRIES(100) FIXED,
2 TOPOFSTACK FIXED;
ALLOCATE STACK SET(X);
TOPOFSTACK = 0;
end;
Рис. 4.13 — Размещение указателей
Только в этой процедуре известна структура данных, на которые ссылается указатель STACK, поэтому довольно сложно изменить эту структуру за пределами процедуры.
Для того чтобы определить функции обращения к стеку, можно использовать операторы ENTRY. Таким образом, вся конструкция STACK в целом имеет следующий вид:
STACK: procedure;
declare X POINTER;
declare 1 STACK BASED(X);
2 ENTRIES(100) FIXED,
2 TOPOFSTACK FIXED;
/* разместить стек */
STACK_INITIALIZATION: ENTRY(X);
...
/* поместить элемент в стек */
PUSH: procedure(X, элемент);
...
return;
/* извлечь элемент из стека */
POP: procedure(X, элемент);
...
return;
...
end;
Рассмотренный способ удовлетворяет основным предъявляемым требованиям: имена структур и их представления разъединены, все операции со стеком сосредоточены внутри одной процедуры (только из этой процедуры можно обращаться к данным). Однако данному способу присущ тот же недостаток, что и первому. С его помощью действительно строятся данные абстрактного типа, однако во многих современных языках не существует ограничений, которые гарантировали бы, что к этим данным никто не обращается, т.е. невозможно запретить программисту напрямую обратиться к данным, на которые ссылается указатель.