Работа со Стеком
Нашел как добавить элемент и как распечатать стек.
Подскажите как удалить или заменить конкретный элемент.
Со стеком работаю с использованием библиотеки <stack>
P.S. Если такой вопрос уже поднимался на форуме плз киньте ссылку!
Удаление элементов в стеке выполняется вызовом функции pop()
Добавление/удаление элементов в стандартном стеке выполняется по принципу LIFO. Произвольный доступ к элементам отсутсвует.
Сори конечно за такой пост!
Разве pop() не удоляет только верхний элемент стека?
В стеке ВСЕ помещается и удаляется с вершины.
Абреввиатура LIFO - "последним пришел первым ушел".
Поэтому это и называется стеком - вы же не пытаетесь из стоящих друг на друге 10 ящиков вытащить 5-й?
если перед вами стоит задача менять 3-й элемент стека (опять же третий откуда?), то варианта три - либо вам нужно убрать с вершины нужное количество элементов, изменить необходимый и поместить все обратно. Или же вам нужен не стек. Или же вам нужен стек - но "третий элемент откудато" вам менять не нужно.
Если у вас есть необходимость изменять элементы не извлекая их в произвольной позиции - используйте вектора, списки и т.п.
Вначале опишите почему вы собственно используете стек - а не вектор например - для которого операция добавления в конец по стоимости такая же как у стека? Но при том возможен доступ к произвольному элементу по индексу.
Вот собственно сам текст задачи если че.
Написать программу для решения задачи. Для хранения данных использовать контейнер. В качестве контейнера использовать стек.
Исходные данные брать из текстового файла с именем «test.txt». Файл сдается вместе с работой и должен содержать не менее 10 записей. В начале работы программы данные загру-жаются в контейнер, а пользователю предлагается меню. Обязательно должно быть реализова-но выполнение следующих функций:
1. добавления в конец;
2. удаления элемента;
3. замены элемента;
4. печати содержимого контейнера;
С 1 и 4 разобрался там все очнь легко, а вот как остальное сделать я не наю.
Удаление можно делать используя дополнительный стек. Даже пожалуй это единственный выход.
Ну а - на ходу не хочу давать рекомендаций - но на первый взгляд я бы реализовал бы шаблон функции для модификации, куда передавал бы указатель на начало стека и итератор, который должен возвращаться функцией поиска. Гдето примерно так. Посмотрите примеры работы с STL, реализации поиска элементов в массиве.
Вечером, если время будет напишу подробнее. Но это не значит что вы сидите и ждете до вечера - вы ищите и смотрите - я буду заниматься этой задачей только при вашем не посредственном участии.
Кстати покажите как вы распечатываете стек? Модификация будет тоже самое, только будет еще третий параметр - что модифицировать. При условии конечно, что вы нормально ее реализовали.
вот как я распечатываю стек
{
cout << " " << mystack.top();
mystack.pop();
}
cout << endl;
Я тоже так подумал... СЕйчас вот пытаюсь реализовать это.
вот как я распечатываю стек
{
cout << " " << mystack.top();
mystack.pop();
}
cout << endl;
но ведь по сути ты не РАСПЕЧАТЫВАЕШЬ стек - ты его ОЧИЩАЕШЬ?
Я думаю ты вряд ли был бы очень рад если бы печать документа его бы уничтожала? :)
в твоей задаче ключевое - использование ИТЕРАТОРОВ - константных (для печати) и не константных (если предполагается модификация данных в стеке). Отправная точка для тебя - это вершина стека. Начиная от вершины ты должен перебирать элементы до тех пор пока итератор не за пределами стека, либо до тех пор - пока не выполнится условие.
Потом отпишусь что получилось.
Скорее всего буду делать через допонительный стек!