как создать стек как структуру, не дублируя его?
Код, представленный вами, в порядке и не будет дублировать большие объемы данных.
Допустим,у вас текущий стек stack1 = a - b - c - d - e
.И теперь вы pop stack1
с кодом:
pop (Stack (x:xs)) = (Just x, Stack xs)
Вы вернете новый стек stack2 = b - c - d - e
, который представляет собой целую структуру после a
, и ничего не копируется.Если вы сохраняете stack1, то у вас будут две структуры, которые выглядят примерно так:
stack1 -> a - b - c - d - e
^
|
stack2
Помните, что используемый вами односвязный список означает, что a
не является частью stack2
.Если stack1
является сборщиком мусора, то в итоге вы получите stack2 = b - c - d - e
, как и следовало ожидать.
Теперь, допустим, вы push z stack2
уступаете stack3 = z - b - c - d - e
.Если stack1
и stack2
еще живы, то куча будет выглядеть примерно так:
stack3 -> z
|
stack1 -> a - b - c - d - e
^
|
stack2