Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Класс стек и очередь на с++

Ответить
Настройки темы
C/C++ - Класс стек и очередь на с++

Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


Помогите, пожалуйста в написании программы на с++, в которой надо написать класс стек с следующимий возможностями: добавить элемент в конец стека; извлечь последний элемент стека ; проверка на то,что стек не пустой! Заранее спасибо!

Отправлено: 19:55, 19-10-2009

 

Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


Помогите пожалуйста написать класс стек на с++, реализующий следующие возможности: добавить элемент в конец стека, извлечь последний элемент стека, проверка на то ,что стек не пуст.

Отправлено: 20:13, 19-10-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


ИО Капитана Очевидности


Contributor


Сообщения: 5383
Благодарности: 1105

Профиль | Отправить PM | Цитировать


Контрольная в школе?
Код: Выделить весь код
class cStack
{
   struct sItem // структура элемента
      {
          int Value; // значение
          sItem *Prev; // указатель на предыдущий элемент
      }

   sItem *fItem; // рабочее поле
}
Вот классическая основа для стека.
Метод Push создаёт в куче новый объект для указателя fItem, адрес старого объекта помещается в поле Prev.
Метот Pop извлекает из поля Prev адрес предыдущего объекта и удаляет текущий.
Метод IsEmpty проверяет, не равен ли указатель fItem нулевому адресу

-------
Самое совершенное оружие, которым забиты арсеналы богатых и процветающих наций, может легко уничтожить необразованного, больного, бедного и голодного. Но оно не может уничтожить невежество, болезнь, нищету и голод. (Фидель Кастро)

Почему всех осужденных за измену Родине при Сталине реабилитировали при Горбачёве по отсутствию состава преступления? Потому что при Горбачёве измену Родине перестали считать преступлением.


Отправлено: 07:17, 20-10-2009 | #3


Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


El Scorpio, спасибо, не очень помогло, по крайней мере мне Пока разбиралась написала нечто следующее:
class AStack
{
public:
struct sItem
{
string Value;
sItem *Prev;
};

sItem *fItem;

// konstruktor
AStack()
{
fItem = new sItem;
fItem = NULL;
}

// destruktor
~AStack() {};

// dobavlenie
void Push(string v)
{
sItem *tmp = new sItem;

tmp->Value = v;
if(!fItem)
fItem = tmp;
else
{
tmp->Prev = fItem;
fItem = tmp;
}
}

// udalenie
AStack Pop()
{
sItem *s = new sItem;
if (fItem == NULL) {cout<<"Error: stek pust" << endl;}
else
{
cout << fItem->Value.c_str() << endl;
fItem = fItem->Prev;
}
AStack P;
P.fItem = fItem;

return P;
};
}

Функцию определения пустоты стека не писала - в задании такого не было (в моем)

Отправлено: 22:35, 27-12-2009 | #4


ИО Капитана Очевидности


Contributor


Сообщения: 5383
Благодарности: 1105

Профиль | Отправить PM | Цитировать


эээ
Цитата Nikilania:
AStack()
{
fItem = new sItem;
fItem = NULL;
} »
Сначала создаём объект типа sItem, а потом обнуляем указатель на него?

Цитата Nikilania:
// destruktor
~AStack() {}; »
То есть, при удалении стека его элементы из памяти удаляться не будут?

Остальных жуков просто лень перечислять

-------
Самое совершенное оружие, которым забиты арсеналы богатых и процветающих наций, может легко уничтожить необразованного, больного, бедного и голодного. Но оно не может уничтожить невежество, болезнь, нищету и голод. (Фидель Кастро)

Почему всех осужденных за измену Родине при Сталине реабилитировали при Горбачёве по отсутствию состава преступления? Потому что при Горбачёве измену Родине перестали считать преступлением.


Отправлено: 02:32, 28-12-2009 | #5

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Я бы сделал через вектор (потом бы долго спорил с преподом что использовать свободную память в задании не было):
Код: Выделить весь код
00 <-- Указатель на начало bptr (begin)
01
02        <- при извлечении смещаем обратно
03 <-- Указатель на конец gptr (get)
04        <- при запоминании смещаем вперёд
05
06
   <-- Конец памяти (максимальная длина стека) eptr (end)
Таким образом нужно:
  • Выделить кусочек памяти, достаточный чтобы поместить максимальное кол-во элементов
  • Заталкивание в стек: *bptr++ = value;
  • Возврат из стека: return *--bptr;
Ну и не забываем проверять границы: bptr <= gptr < eptr
Тов. программисты форума, у меня в браузере глючит перенос строчки, когда заполнишь окошко ввода ответа (удаляет перенос строки или проворачивает прокрутку обратно), IE8

Отправлено: 09:19, 28-12-2009 | #6


Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


Специализированный деструктор я не писала, а увиденное вами - привычка обозначать что таковой имеется! С указателем ошиблась - в конечной версии программы такого бага нет. Там необходимо обнулять указатель на следующий элемент.
PS: если мое конструктивное не подходит под мерки функциональной программы предлагаю вам написать свою, а не цитировать всем известный учебник

Отправлено: 14:56, 29-12-2009 | #7


ИО Капитана Очевидности


Contributor


Сообщения: 5383
Благодарности: 1105

Профиль | Отправить PM | Цитировать


Nikilania, повторяю мысль - объект, в тексте которого содержится много new и ни одного delete выглядит странно
Хотя бы деструктор должен иметь код удаления объектов
Код: Выделить весь код
AStack (void)
{
    sItem *temp;
    while ((temp = fitem) != NULL)
    {
        fitem = temp->prev;
        delete temp;
    }

}
Кроме того, delete должно вызываться и при вызове Pop

-------
Самое совершенное оружие, которым забиты арсеналы богатых и процветающих наций, может легко уничтожить необразованного, больного, бедного и голодного. Но оно не может уничтожить невежество, болезнь, нищету и голод. (Фидель Кастро)

Почему всех осужденных за измену Родине при Сталине реабилитировали при Горбачёве по отсутствию состава преступления? Потому что при Горбачёве измену Родине перестали считать преступлением.


Отправлено: 07:41, 30-12-2009 | #8

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать



Nikilania, я так понимаю про учебник - это в мой огород камень, по этому поводу хочу пояснить:
  • Не знаю, из какого это учебника, такой принцип используется в стеке вызовов (инструкция CALL) процессора. Каюсь, названия для указателей взял общепринятые (для понятности)
  • Я не указываю как делать, а лишь предлагаю рассмотреть альтернативный способ тем, кто читает эту тему, но ещё не реализовал свой алгоритм. Это не ограничивает функциональность вашего алгоритма.

Вообще есть такие варианты реализации контейнеров:
  • Вектор, элементы хранятся в одной группе (требует цельный кусок памяти, но работает быстрее всех)
  • Двусвязный список, элементы связаны указателями (частое обращение к диспетчеру памяти, но экономит память)
  • Дека (deque) гибрид первого и второго, элементы в небольших группах, группы в 2-связных списках (сбалансированный, но сложнее код)
Ваша реализация, Nikilania - это 2-связный список который тоже есть в известных учебниках

Отправлено: 07:54, 30-12-2009 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Класс стек и очередь на с++

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Теория - Стек, заданный списком, на Паскале. ManHack Программирование и базы данных 9 07-04-2009 23:48
Стек драйверов как узнать? Ursus Spelaeus Программирование в *nix 1 05-08-2008 19:03
Очередь печати Mix Shumaher Microsoft Windows NT/2000/2003 3 13-03-2006 23:06
очередь печати andyzu Microsoft Windows 95/98/Me (архив) 3 05-01-2004 09:44
Стек коммутаторов Allied Telesyn 8324 6 шт. Animal Сетевые технологии 2 21-02-2003 15:06




 
Переход