Циклическая очередь
Для очереди используйте массив указателей на строки.
Продемонстрируйте добавление элемента, удаление элемента, добавление в переполненную очередь, удаление из пустой очереди. После каждого примера вывести содержимое очереди.
Вы могли бы помочь мне с комментариями, объясняющими как работает следующий код в циклической очереди, пожалуйста.
Код:
#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;
}
#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;
}
так что нечего тут объяснять, IMHO код ошибочный
Цитата: grgdvo
Что-то здесь не правильно. Меня смущает в push и pop разная работа с индексами in и out, причем они никак не сопрягаются вместе... многократный push-pop будет давать ошибку
так что нечего тут объяснять, IMHO код ошибочный
так что нечего тут объяснять, IMHO код ошибочный
Почему ошибка? код компилируется без ошибок.
А main легко объяснить:
1. Создали очередь размер 1
2. Засунули в первый элемент очереди hello, world!
3. Заменили первый элемент на This Qt!
4. Вывели текст первого элемента - это This Qt!
5. Дождались нажатия кнопки
6. Вышли из программы, удалив объект очереди.