Очередь на языке С++

62
21 октября 2021, 22:30

Пытаюсь решить следующую задачу: создать пользовательскую очередь, в которой каждый элемент равен сумме предыдущих, первый элемент равен 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;
}
Answer 1

Не знаю зачем все усложняете. Вам нужно делать следующее:

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) {};

READ ALSO
Что я упустил text text

Что я упустил text text

Получается бесконечный цикл

87
Как показать данные из массива объектов в списке?

Как показать данные из массива объектов в списке?

Есть функция, которая получает массив policies[]:

80