обсуждение двухсвязнного списка порядка LIFO
если я работаю со стеком то сначала делаю техн часть вопроса (про беру:p )
а при решении конкретной задачи уже не думаю как реализован стек а просто им пользуюсь через парочку описаных функций
в общем мы отвлеклись от темы:)
ps про lifo это у меня склероз)))) там last конечно
pps а стек можно и без двухсвязного...
зачем хранить столько никому не нужных ссылок
Как сейчас помню, на 1 курсе нас заставляли стек организовывать с помощью односвязного списка, чтобы сэкономить память.
char info;
Store *next;
}
void set(Store *store, char info) {
Store tmp = new Store();
tmp->info = info;
tmp->next = store;
store = tmp;
}
char get(Store *store) {
char info = store->info;
Store tmp = store;
store = store->next;
delete tmp;
return info;
}
Предлагаю так.
Зачем нужно его давать на экзамене, или зачем нужна в программировании эта структура?
зачем он нужен для стека я думаю имелось ввиду
вообще говоря для реализации стека он не нужен:)
хватит и однонаправленного
Для решения данной задачи :).
Имхо, хороший препод не ограничивает студента в выборе инструмента. Пусть говорит, что делать, а уж как - это без него разберемся, а вот если не сумеем - тогда и спросим (самый типичный в нашем универе пример - это когда требуют написать диалоговое приложение строго на WinAPI, и ругаются, что работаем медленно:)).
2OlgaKr - а почему не рекомендуешь Шилдта? Мне кажется, вполне приличный базовый курс.
ну это уже зависит от поставленной задачи
Двусвязные списки нужны для того, чтобы иметь возможность удалять элемент списка не только концов, но и из середины.А сами двусвязные списки используються например для реализации разряженых матриц в виде триплетов.
а кто вам мешает удалять из середины однонаправленного? )
не нужно говорить что удобнее и тп
зависит от конкретной задачи
Однонаправленный список для этого не предназначен просто).
З.Ы. Насчет невозможно я погарячился конечно, но то, что это неоправдано то точно)
не нужно говорить что удобнее и тп
зависит от конкретной задачи
Да, это зависит от задачи. От задачи реализации стека. Так как одно из основных свойств списка - это быстрый поиск нужного элемента, то в этом случае удобнее использовать двусвязный списк. Именно удобнее. Удобнее тем, что проходить список можно с любого конца. Это, в отличии от односвязного, у которого обнаруживается линейная зависимость времени поиска от размера T(n) = n, дает определенный выигрыш в скорости.
Некоторые реализации двусвязных списков, содержат указатель не только на первый и последний элементы, но и на средний, тем самым еще более уменьшая время нахождения нужного элемента. Можно использовать двусвязные кольцевые списки с плавающим окном. Тут уже имеют смысл "статистические данные" обращения к списку.
Если и нужен быстрый поиск, то уж использовать двусвязные списки я не буду. В любом случае порядок будет n, обусловленный последовательным доступом.
А мне бы хотелось log(n).
[QUOTE=Lerkin]Удобнее тем, что проходить список можно с любого конца. Это, в отличии от односвязного, у которого обнаруживается линейная зависимость времени поиска от размера T(n) = n, дает определенный выигрыш в скорости.[/QUOTE]Неа.)
Вот такой список при поиске по ключу 46, ты наверное на базе анализа концевых элементов решишь искать с головы(45) и те придеться весь список просматреть и никакого выигрыша.
45 45,1 45,2 45,3 45,4 45,5 46 30
А мне бы хотелось log(n).
[/QUOTE]
эт врядли получится так просто
хотябы 1.45log(n)
и то это то тяжеловато получить
хотябы 1.45log(n)
и то это то тяжеловато получить[/QUOTE]
Бинарный поиск.
Поиск делением пополам.
Смысл один в основе бинарное дерево.
а если брать авл дерево то там будет около 1.4log(n) сложность
вставка сложнее но искать быстро :)
ps а вообще к списку и стеку это все отношения не имеет
ps а вообще к списку и стеку это все отношения не имеет
Краткий списочек структур данных. :)