Пытаюсь решить следующую задачу: создать пользовательскую очередь, в которой каждый элемент равен сумме предыдущих, первый элемент равен 1, второй вводится с клавиатуры.
Вот код, который у меня изначально работал прекрасно:
//создать очередь, в которой каждый элемент равен сумме предыдущих
#include <iostream>
using namespace std;
class elem
{
public:
int data;
elem* next;
elem(int& a) :data(a), next(NULL)
{};
};
class myQueue
{
private:
elem* head;
public:
void push(int& newelem)
{
elem* temp = new elem(newelem);
if (head != NULL)
{
elem* t = head;
while (t->next != NULL)
{
t = t->next;
}
t->next = temp;
}
else head = temp;
}
int front()
{
return head->data;
}
int back()
{
elem* tmp = head;
while (tmp->next != NULL)
{
tmp = tmp->next;
}
return tmp->data;
}
bool empty()
{
return head == NULL;
}
void pop()
{
head = head->next;
}
~myQueue()
{
elem* temp = head;
while (temp != NULL)
{
head = head->next;
delete temp;
temp = head;
}
}
myQueue() :head(NULL)
{};
};
int main()
{
setlocale(LC_ALL, "rus");
int N, m, l, h = 0, j=1, u;
myQueue queue1;
cout << "Введите размер очереди: ";
cin >> N;
queue1.push(j);
cout << "добавьте число в очередь" << endl;
cin >> m;
for (int i = 0; i != N - 1; i++)
{
l = queue1.back();
if (h != 1) {
queue1.push(m);
++h;
l = l + queue1.back();
queue1.push(l);
}
else {
l = l + queue1.back();
queue1.push(l);
}
}
cout << "===========================" << endl;
for (int i = 0; i != N; i++)
{
cout << queue1.front() << endl;
queue1.pop();
}
system("pause");
return 0;
}
Однако преподавателю не нравится, что я использовал метод back(). Я попытался переделать без него, используя вторую очередь, но теперь мне выдаёт исключение, с которым я не знаю, что делать. Буду благодарен за помощь.
//создать очередь, в которой каждый элемент равен сумме предыдущих
#include <iostream>
using namespace std;
class elem
{
public:
int data;
elem* next;
elem(int& a) :data(a), next(NULL)
{};
};
class myQueue
{
private:
elem* head;
public:
void push(int& newelem)
{
elem* temp = new elem(newelem);
if (head != NULL)
{
elem* t = head;
while (t->next != NULL)
{
t = t->next;
}
t->next = temp;
}
else head = temp;
}
int front()
{
return head->data;
}
int back()
{
elem* tmp = head;
while (tmp->next != NULL)
{
tmp = tmp->next;
}
return tmp->data;
}
bool empty()
{
return head == NULL;
}
void pop()
{
head = head->next;
}
~myQueue()
{
elem* temp = head;
while (temp != NULL)
{
head = head->next;
delete temp;
temp = head;
}
}
myQueue() :head(NULL)
{};
};
int main()
{
setlocale(LC_ALL, "rus");
int N, m, l, h = 0, j=1, u;
myQueue queue1, queue2;
cout << "Введите размер очереди: ";
cin >> N;
queue1.push(j);
queue2.push(j);
cout << "добавьте число в очередь" << endl;
cin >> m;
for (int i = 0; i != N - 1; i++)
{
l = queue2.front();
if (h != 1) {
queue1.push(m);
++h;
queue2.pop();
u = queue2.front();
queue2.push(u);
l = l + queue2.front();
queue1.push(l);
}
else {
queue2.pop();
u = queue2.front();
queue2.push(u);
l = l + queue2.front();
queue1.push(l);
}
}
cout << "===========================" << endl;
for (int i = 0; i != N; i++)
{
cout << queue1.front() << endl;
queue1.pop();
}
system("pause");
return 0;
}
Не знаю зачем все усложняете. Вам нужно делать следующее:
int N, m, sum = 1;
myQueue q;
cout << "Введите размер очереди: ";
cin >> N;
q.push(sum);
cout << "добавьте число в очередь" << endl;
cin >> m;
q.push(m);
sum += m;
while (N > 2) { //два элемента уже есть
q.push(sum);
sum += sum;
--N;
}
while (!q.empty()) {
cout << q.front() << ' ';
q.pop();
}
Кроме этого у вас в классе есть следующие ошибки:
void pop()
{
head = head->next;
}
А что делать с тем элементом, на который указывал head
до вызова метода? А если очередь вообше пустая?... Наверное переписать на:
void pop()
{
if (!empty()) {
elem* temp = head;
head = head->next;
delete temp;
}
}
Дальше:
в деструкторе и в методе front
отсутствует проверка на пустоту
очереди.
в конструкторе elem
не нужна ссылька(передайте по значению). Не
написан конструктор по умолчанию для этого класса(думаю только он и
нужен там)
В очереди не бывает метода back()
, так что его вовсе удалите
Убрать точку с запятой здесь: myQueue() :head(NULL) {};
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть функция, которая получает массив policies[]: