Реализуйте структуру данных "стек" - Turbo Pascal
Формулировка задачи:
Реализуйте структуру данных "стек". Напишите программу, содержащую описание стека и моделирующую работу стека, реализовав все указанные здесь методы. Программа считывает последовательность команд и в зависимости от команды выполняет ту или иную операцию. После выполнения каждой команды программа должна вывести одну строчку. Возможные команды для программы:
push n
Добавить в стек число n (значение n задается после команды). Программа должна вывести ok.
pop
Удалить из стека последний элемент. Программа должна вывести его значение.
back
Программа должна вывести значение последнего элемента, не удаляя его из стека.
size
Программа должна вывести количество элементов в стеке.
clear
Программа должна очистить стек и вывести ok.
exit
Программа должна вывести bye и завершить работу.
Входные данные
Команды управления стеком вводятся в описанном ранее формате по 1 на строке.
Гарантируется, что набор входных команд удовлетворяет следующим требованиям: максимальное количество элементов в стеке в любой момент не превосходит 100, все команды pop и back корректны, то есть при их исполнении в стеке содержится хотя бы один элемент.
Выходные данные
Требуется вывести протокол работы со стеком, по 1 сообщению в строке
Примеры
входные данные
выходные данные
push 3
push 14
size
clear
push 1
back
push 2
back
pop
size
pop
size
exit
ok
ok
2
ok
ok
1
ok
2
2
1
1
0
bye
Решение задачи: «Реализуйте структуру данных "стек"»
textual
Листинг программы
Const SS = 'push pop back size clear exit '; Type Stk = ^tStk; tStk = Record A : Integer; Next : Stk; end; Var P : Stk; S : String; N,tt : Integer; Procedure Push(Var pp : Stk; nn : Integer); Var T : Stk; Begin New(T); T^.A:=nn; T^.Next:=pp; pp:=T; Writeln('ok'); end; Procedure Pop(Var pp : Stk); Var T : Stk; Begin If pp<>nil then Begin Writeln(pp^.A); T:=pp; pp:=pp^.Next; Dispose(T); end; end; Procedure Back(Var pp : Stk); Begin If pp<>nil then Writeln(pp^.A); end; Procedure Siz(Var pp : Stk); {Этот метод не очень корректен, т.к. нарушает правила работы со структурой тип "стек", но зато короче и проще.} {Если это принципиально, то рекомендую самим занятся реализацией второго стека для хранения/перекладывания значений с подсчётом их количества.} Var i : Integer; T : Stk; Begin i:=0; T:=pp; While T<>nil do Begin Inc(i); T:=T^.Next; end; Writeln(i); end; Procedure Clr(Var pp : Stk); Var T : Stk; Begin While pp<>nil do Begin T:=pp; pp:=pp^.Next; Dispose(T); end; Writeln('ok'); end; Procedure Ext(Var pp : Stk); Begin Clr(pp); Writeln('bye'); end; Begin P:=nil; Repeat Readln(S); Val(Copy(S,Pos(' ',S)+1,Length(S)-Pos(' ',S)),N,tt); If Pos(' ',S)>0 then S:=Copy(S,1,Pos(' ',S)-1); { Case S of 'push' : Push(P,N); 'pop' : Pop(P); 'back' : Back(P); 'size' : Siz(P); 'clear' : Clr(P); 'exit' : Ext(P); end; } Case Pos(S,SS) div 6 of 0 : Push(P,N); 1 : Pop(P); 2 : Back(P); 3 : Siz(P); 4 : Clr(P); 5 : Ext(P); end; Until S='exit'; end.
Объяснение кода листинга программы
- В процедуре Push новый элемент со значением nn добавляется в стек, а указатель на предыдущий элемент сдвигается вправо.
- В процедуре Pop из стека удаляется верхний элемент, его значение выводится на экран, а указатель на предыдущий элемент сдвигается вправо. Если стек пуст, то ничего не происходит.
- В процедуре Back выводится значение верхнего элемента стека.
- В процедуре Siz (не совсем корректной) перебираются все элементы стека, начиная с верхнего, и увеличивается счетчик i на каждый элемент. В конце выводится значение счетчика.
- В процедуре Clr все элементы стека удаляются, начиная с верхнего, и выводится сообщение 'ok'.
- В процедуре Ext сначала очищается стек, затем выводится сообщение 'bye'.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д