Решение задачи со стеками о очередью с помощью динамических списков

Изучаю C++ и мне нужно решить задачу, представляя очередь и стек как динамические списки. Задача: Даны два стека целых чисел от 0 до 1000. Из элементов пеpвого стека, котоpых нет во втоpом сфоpмиpовать очеpедь.

Я понимаю как инициализировать стек и очередь и необходимую функции для работы, но как реализовать функцию, которая сравнивает стеки и кладёт их элементы в очередь я понятия не имею. Не знаю есть ли смысл в написании кода в вопросе, потому что он просто не готов но всё равно его здесь. Вдруг поможет.

#include <iostream>
#include <ctime>

using namespace std;

struct Stack {
    int data;
    Stack* next;
};

void InitStack(Stack*& top) {
    top = NULL;
}

void push(Stack*& top, int value) {
    Stack* tmp = new Stack;
    tmp->next = top;
    top = tmp;
    top->data = value;
}

int pop(Stack*& top) {
    Stack* tmp = top;
    int d = top->data;
    top = top->next;
    delete(tmp);
    return d;
}

bool Empty(Stack*& top) {
    return (top == NULL);
}

void  nullStack(Stack*& top) {
    Stack* tmp;
    while (!Empty(top)) {
        tmp = top;
        top = top->next;
        delete(tmp);
    }
}
void print(Stack*& top) {
    if (!Empty(top)) {
        Stack* tmp = top;
        while (!Empty(tmp)) {
            cout << tmp->data << " ";
            tmp = tmp->next;
        }
        cout << endl;
        delete(tmp);
    }
    else {
        cout << "Стек пуст!\n";
    }
}
class Queue {
private:
    struct Node
    {
        int data;
        Node* next;
    };
    Node* head, * tail;

public:
    Queue() {
        head = NULL;
        tail = NULL;
    }

    bool empty() {
        return head == NULL;
    }

    void add(int value) {
        if (empty()) {
            head = new Node;
            head->data = value;
            head->next = NULL;
            tail = head;
        }
        else {
            tail->next = new Node;
            tail = tail->next;
            tail->data = value;
            tail->next = NULL;
        }
    }

    int del() {
        if (empty()) {
            cout << "Очередь пуста!\n";
            return 0;
        }
        else {
            int d = head->data;
            Node* tmp = head;
            head = head->next;
            delete tmp;
            return d;
        }
    }

    void nullQueue() {
        Node* tmp;
        while (!empty()) {
            tmp = head;
            head = head->next;
            delete tmp;
        }
    }

    void print() {
        Node* temp = head;     
        while (temp != NULL)
        {
            cout << temp->data << " "; 
            temp = temp->next;
        }
        cout << endl;
    }
    
};
int main() {
    return 0;
}

Ответы (2 шт):

Автор решения: MBo

Пусть у вас есть стеки А и В. Создайте дополнительный стек С.

Теперь извлекаете по одному элементу из А, потом сравниваете с ним все элементы B, перекидывая их в стек С. Если не нашли аналога =- кладёте элемент из A в очередь.

На следующем шаге берёте новый элемент из А, а сравниваете с элементами из C, перекладывая их в В.

И т.д., пока A не кончится.

→ Ссылка
Автор решения: xmikex

Явно тут многое неправильно, но оно выполняет примерно то, что нужно в задании. Правда тут не выполнена инициализация 1000 элементов, а просто вводится по 10 элементов для каждого стека.

#include <list>
#include <iostream>
#include <algorithm>
#include <iterator>

using namespace std;

struct Stack
{
    list <int> data;

    int push(int num)
    {
        data.push_back(num);
        return 0;
    }
    int pop()
    {
        int i = data.back();
        data.pop_back();
        return i;
    }
};

struct Queue
{
    list <int> data;

    int enqueue(int num)
    {
        data.push_back(num);
        return 0;
    }
    int dequeue()
    {
        int i = data.front();
        data.pop_front();
        return i;
    }
};


int main()
{
    Stack A, B;
    Queue result;
    
    string input;
    int num;

    list <int> :: iterator itA;
    list <int> :: iterator itB;
    bool found = false;

    for(int i=0;i<10;i++)
    {
        cin>>num;
        cout<<i<<endl; 
        A.push(num);
    }
    cout << "Введите второй стек"<<endl;
    
    for(int i=0;i<10;i++)
    {
         cin>>num;
         cout<<i<<endl;
         B.push(num);
    }

    for(itA=A.data.begin();itA!=A.data.end();itA++)
    {
        found = false;
        for(itB=B.data.begin();itB!=B.data.end();itB++)
            if((*itA) == (*itB)){found=true;break;}
        if(!found)
            result.enqueue(*itA);
    }

    cout << "Результат работы: "<<endl;
    for(int i: result.data)
        cout << i << endl;
}
→ Ссылка