Struktury, stosy i kolejki

0

Witam, mam zadanie w którym z pliku binarnego struktura zawodnik w którym jest pole imię i nazwisko pobrać dane i zapisać do pliku tekstowego pary nazwisk ( pierwszy z ostatnim , drugi z przedostatnim itd ) używając stosu i kolejki. Wytłumaczy ktoś jak to zrobić?

0

Po co Ci stos i kolejka, kolejka wystarczy(dokładniej Double Ended Queue, dalej DEQ). W DEQ, dokładanie i ściąganie elementów, z końca i początku są O(1).
http://www.cplusplus.com/reference/deque/deque/

0

Posługując się podwójną kolejką można korzystać ze struktur czy tylko z klasy? Trochę poczytałem o kolejkach i tak oto powstał początek kodu.

#include <iostream>
#include <fstream>
#include <string>
#include <queue>

using namespace std;

#pragma pack(push, 1)
struct player
{
    string name;
    string surname;
};
#pragma pack(pop)

queue <player> quequeplayer;
int main()
{
    
    ifstream ifs("plik.bin", ios::binary);
    char* temp = new char[sizeof(player)]; // tymczasowy bufor na dane
    ifs.read(temp, sizeof(player)); // wczytujemy dane do bufora
    player* file = (player*)(temp); // rzutujemy zawartość bufora na typ File
    
    cout << file->name <<  " " << file->surname << endl;
    delete file;
}

Początek już mam, teraz jak zrobić aby zapisać do pliku tekstowego pary nazwisk tj jest w zadaniu?

0

To nie zadziała.
std::string to coś innego niż char*.
sizeof(std::string) nie pokaże Ci wielkości (długości) ciągu. W większości przypadków będzie różny od wartości std::length(), której oczekujesz.
Musisz to rozwiązać inaczej.
Zapisując dodawaj długość ciągu na początku lub odczytuj do znaku '\0'.

Jak robisz new[] to zwalnianie też musi być z nawiasami (delete[]).

0

Używając tylko kolejki i stosu można napisać następujący algorytm ( zakładam że liczba nazwisk jest parzysta ):

#include <iostream>
#include <stack>
#include <queue>
#include <vector>

using namespace std;

int main()
{
    vector<string> names = { "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8" };
    vector<pair<string,string>> namePairs;

    queue<string> queueNames; // FIFO
    stack<string> stackNames; // LIFO

    for( const auto& name : names )
    {
        queueNames.push(name);
        stackNames.push(name);
    }

    for( auto i=0 ; i<names.size()/2 ; ++i )
    {
        namePairs.push_back( { queueNames.front() , stackNames.top() } );
        queueNames.pop();
        stackNames.pop();
    }

    for( const auto& [back,front] : namePairs )
    {
        cout << back << " " << front << "\n";
    }

    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1