Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Циклическая очередь

62K
01 июня 2016 года
Nas_96
19 / / 13.03.2016
Организуйте циклическую очередь для хранения строк.
Для очереди используйте массив указателей на строки.
Продемонстрируйте добавление элемента, удаление элемента, добавление в переполненную очередь, удаление из пустой очереди. После каждого примера вывести содержимое очереди.

Вы могли бы помочь мне с комментариями, объясняющими как работает следующий код в циклической очереди, пожалуйста.

Код:
#include <iostream>
#include <cstring>
#include <conio.h>
 
using namespace std;
 
class Ring
{
    char **line;
    size_t max, in, out;
public:
    Ring(size_t len) : line(new char*[len]()), max(len), in(0), out(0) {}
    ~Ring() {
        while (pop());
        delete[] line;
    }
    bool push(const char*);
    bool pop();
    const char *first() const { return line[out]; }
    bool empty() const { return bool(line[out]); }
};
 
int main()
{
    Ring queue(1);
    queue.push("Hello World!");
    queue.push("This Qt!");
    cout << queue.first() << endl;

    _getch();    
}
 
bool Ring::push(const char *str) {
    if (line[in])
        return false;
    line[in] = new char [strlen(str) + 1];
    line[in] = strcpy(line[in], str);
    in + 1 == max ? in = 0 : ++in;
    return true;
}
 
bool Ring::pop() {
    if (!line[out])
        return false;
    delete[] line[out];
    line[out] = nullptr;
    out + 1 == max ? out = 0 : ++out;
    return true;
}
97K
02 июня 2016 года
vasyan423
1 / / 02.06.2016
s
412
02 июня 2016 года
grgdvo
323 / / 04.07.2007
Что-то здесь не правильно. Меня смущает в push и pop разная работа с индексами in и out, причем они никак не сопрягаются вместе... многократный push-pop будет давать ошибку
так что нечего тут объяснять, IMHO код ошибочный
62K
02 июня 2016 года
Nas_96
19 / / 13.03.2016
Цитата: grgdvo
Что-то здесь не правильно. Меня смущает в push и pop разная работа с индексами in и out, причем они никак не сопрягаются вместе... многократный push-pop будет давать ошибку
так что нечего тут объяснять, IMHO код ошибочный

Почему ошибка? код компилируется без ошибок.

412
03 июня 2016 года
grgdvo
323 / / 04.07.2007
Когда размер очередь = 1, конечно будет компилироваться и работать. Увеличьте размер очереди, добавьте push-pop и увидите, что не работает (специально не запускал, развиваю экстрасенсорные способности).
А main легко объяснить:
1. Создали очередь размер 1
2. Засунули в первый элемент очереди hello, world!
3. Заменили первый элемент на This Qt!
4. Вывели текст первого элемента - это This Qt!
5. Дождались нажатия кнопки
6. Вышли из программы, удалив объект очереди.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог