Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/46: Рейтинг темы: голосов - 46, средняя оценка - 4.83
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282
1

Очередь FIFO

21.05.2012, 19:37. Показов 8370. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер. Задали написать реализацию очереди FIFO. Загвоздка в том, как передать указание на следующий элемент при его добавлении.

Недавно писал FILO, там было так:

C++
1
2
3
4
5
6
7
8
9
10
bool stack::Push(int v){
ST_LIST *item;
item = new ST_LIST;
 
if (item) {
 item->value=v;
 item->next=first;
 first=item;
 return true;
}
а тут как? тут при добавлении нужно чтобы указатель на вершину был постоянен, а список рос с конца. Подскажите)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.05.2012, 19:37
Ответы с готовыми решениями:

Очередь FIFO
Нужно создать очередь FIFO(первым пришел - первым ушел) с помощью массива. В интернете читала...

Очередь FIFO
Нашел код struct fifo_node { struct fifo_node *next; value_type value; }; class fifo...

Динамическая Очередь (FIFO).
Здравствуйте! Ребят, кому невмоготу , помогите реализовать структуру согласно этим требованиям:...

Двумерная очередь (FIFO)
Помогите реализовать FIFO .

11
-19 / 6 / 0
Регистрация: 09.10.2010
Сообщений: 41
21.05.2012, 19:40 2
это структура типа очередь. Хранишь начало, и конец. Данные забираешь сначала. Записываешь в конец
0
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282
21.05.2012, 20:55  [ТС] 3
Я в ступоре, как сделать функцию добавления в очередь((

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int k=1;
bool spis::Push(int v){
    ST_LIST *item;
    item=new ST_LIST;
    
 
    if (k==1){
        if (item){
            item->value=v;
            first=item;
            return true;
            k++;
        }
        else return false;
    }
    else {
        if (item){
            item->value=v;
            item->next=item;
            return true;
            k++;
        }
        else return false;
    }
 
}
Помогите пожалуйста, этот вариант не работает(((

Добавлено через 11 минут
при первой записи я запоминаю first, при второй - end, а потом при добавлении любого элемента end будет указывать на него, а next - на предыдущий?

Или как?

Добавлено через 49 минут
Ребят, помогите пожалуйста, очень надо до завтра...
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
21.05.2012, 20:56 4
вот топорный вариант:
имея указатель на начало списка вы всегда можете в цикле добраться до его последнего элемента (до тех пор пока item->next не станет равным нулю). вот у вас есть последний итем.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
item* getPredLastItem() // получение предпоследнего
{
  // тут алгоритм прохода от начала до предпоследнего итема. реализовать не сложно.
  return predLast;
}
 
item* getLastItem()
{
   // список может быть пустым и getPredLastItem() может вернуть 0. нужно проверять.
  return getPredLastItem()->next;
}
 
void push(int value)
{
  Item* newItem = new Item();
  newItem->value = value;
  newItem->next = 0;
   // список может быть пустым и getLastItem() может вернуть 0. нужно проверять.
  Item* lastItem = getLastItem();
  lastItem->next = newItem;
}
 
void pop()
{
   // список может быть пустым и getLastItem() может вернуть 0. нужно проверять.
  Item* predLastItem = getPredLastItem();
  delete predLastItem->next; // дестроим последний итем
  predLastItem->next = 0; // теперь предпоследний помечен как последний.
}
0
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282
21.05.2012, 21:02  [ТС] 5
DU, я не понимаю(
Чего-то туго очень все... Можно целиком работающий код?
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
21.05.2012, 21:07 6
вы спрашивайте, не стесняйтесь. что именно вам не понятно?
0
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282
21.05.2012, 21:13  [ТС] 7
мне не понятна Ваша реализация функций добавления элемента и удаления.

Вот как я понимаю очередь: записываем первый элемент - он first, на следующий, который мы запишем, будет ссылка next от того, который first...и так далее. нет?
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
21.05.2012, 21:26 8
я привел несколько упрощенный вариант, которые не рассматривает случай, когда список пустой.
предположим в списке десяток объектов. чтобы добавить в конец списка элемент, нужно:
1 создать новый
2 взять текущий последний.
3 к последнему присоединить новый.

т.е.
C++
1
2
3
4
5
6
7
8
9
10
// создаем новый
Item* newItem = new Item();
newItem->value = value;
newItem->next = 0;
 
// Теперь берем последний итем списка
Item* lastItem = getLastItem();
 
// и присоединяем к нему этот новый.
lastItem->next = newItem;
это понятно?

удаление последнего тоже вроде простое
берем предпоследний итем. по нему находим последний. удаляем последний (delete). помечаем предпоследний последним.
0
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282
21.05.2012, 21:30  [ТС] 9
Да. Это понятно.

А как реализовать, танцуя от того, что изначально очередь пустая? Можете помочь?
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
21.05.2012, 21:41 10
ну все же просто. если getLastItem вернула 0, значит список пустой. значит у него еще нет головы (первого итема.). значит новый созданный и будет его головой. т.е что-нибудь типа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void push(int value)
{
  Item* newItem = new Item();
  newItem->value = value;
  newItem->next = 0;
 
  Item* lastItem = getLastItem();
  if (lastItem == 0) // если список пустой
  {
     firstItem = newItem;
  }
  else
  {
     lastItem->next = newItem;
  }
}

для удаления последнего элемента из списка действия такие же
если предпоследний элемент не вернулся, значит список или пустой или состоит из одного элемента. проверяем firstItem. если оно нуль - значит список пустой и ничего из него удалить не получится.
если же firstItem не ноль - то он является последним в списке. его нужно задестроить и указатель firstItem приравнять к нулю.
0
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282
21.05.2012, 22:20  [ТС] 11
Хорошо, попробую реализовать. Осталось реализовать вывод на печать...

Добавлено через 13 минут
DU, я не могу реализовать Ваш метод. У Вас не рабочего кода?

Добавлено через 23 минуты
Ребят выручите пожалуйста. Завтра сдавать, а реализовать не могу. Очень нужно
0
0 / 0 / 0
Регистрация: 19.06.2012
Сообщений: 22
19.06.2012, 19:45 12
вот код посоны
#pragma once;
///////// LIFO
class Lifo
{
int *stack;
int size;
int *p;

public:
Lifo(int size=10):size(size)
{
stack=new int [size];
p=stack;
}
bool isEmpty()
{
return stack==p;
}
bool isFull()
{
return stack+size==p;
}
bool push (int value)
{
if(isFull()) return false;
*p=value;
++p;
return true;
}
int pop ()
{
if(isEmpty()) return 0;
--p;
return *p;
}

~Lifo()
{
delete[]stack;
}

void SetEmpty()
{
p=stack;
}

};
0
19.06.2012, 19:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.06.2012, 19:45
Помогаю со студенческими работами здесь

Очередь целых чисел (структура FIFO)
Требуется : Разработать класс «очередь целых чисел» (структура FIFO). Реализовать методы добавления...

FIFO Очередь, как с ней разобратся??
Разработать подпрограммы работы с приоритетной очередью. Постановка запросов в очередь выполняется...

Изменить удаление и добавление элементов в очередь по правилу FIFO.
Необходимо изменить удаление и добавление элементов в очередь (функции push и pop), по правилу...

Описать класс, реализующий очередь целых чисел типа FIFO.
Класс Очередь: Методы класса: а) создание очереди; б) добавление элемента в очередь (функция...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru