Интуитивно, мы думаем о стеках как о тех вещах, в которые мы можем помещать значения, чье верхнее значение - это то, что было добавлено последним, и что, если мы вытолкнут стек, в который мы поместили значение, у нас будет исходный стек.
Эта интуиция может быть представлена как абстрактная алгебра , где Push и Pop представляют любые вычисления в объекте данных, называемом стеком, включающим ELements:
algrebra Stack
{
data Stack;
data Element;
Empty() -> Stack;
Push(Stack,Element) -> Stack;
Pop(Stack) -> Stack;
Top(Stack) -> Element;
axiom Top(Push(s,e))==e;
axiom Pop(Push(s,e))==s;
axiom Pop(Empty())==undefined;
}
Что этоговорит, что если вы можете найти сущности в вашей системе,
- некоторые из которых вы утверждаете, являются типами стеков
- некоторые из которых вы утверждаете, что элементы,
- некоторыеэто функции, которые вы называете Push,
- некоторые функции, которые вы называете Pop, Top, Empty и т. д.
тогда сигнатуры различных функций совпадают с сигнатурами валгебра, и что если вы применяете различные функции, они будут вести себя так, как указывают аксиомы.(Выбранные вами объекты «изоморфны» алгебре).
Преимущество этой точки зрения состоит в том, что она говорит ничего о реализации различных сущностей, в то же время сохраняя сущность.Эта алгебра охватывает различные артефакты, описанные в других ответах;должно быть ясно, что линейная область хранения, используемая в качестве стека, является стеком, что связанный список, использующий стек, является стеком, что дека, используемая одним концом, является стеком, что серия дисковых блоков, используемых в качестве стека, является стеком, ...
Что действительно круто, так это то, что вы можете переименовывать все типы данных и функции внутри алгебры стека, и при этом все равно распознавать стек, потому что переименование не влияет на изоморфизмы (потому что согласованное переименование - это просто еще одноизоморфизм, и изоморфизмы составляют произведение изоморфизмов).Все, что соответствует этой спецификации , является стеком!
Тот факт, что имена функций в реализации могут быть любыми и в то же время все еще совпадают, и что мы можем переименовать имена функций абстрактной алгебры во что угодно, и при этом совпадать, позволяет нам, по соглашению, дать абсолюталгебраические функции называют те, которые мы считаем представительными.«Push» и «pop» - это те, которые выбираются по соглашению.
Так что я бы сказал, что вы можете называть свое имя своими функциями реализации как угодно, но называйте их Push и Pop, если их действия понимают это.алгебра.
Итак, можно определить стек по формальной спецификации.Таким же образом вы можете определить любую другую структуру данных.
Жаль, что мы не делаем больше этого при документировании реального кода.