Stos obiektowy - dobrze napisałem kod?

Stos obiektowy - dobrze napisałem kod?
N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
0

Napisałem stos obiektowy, chciałem spytać czy jest dobrze. I mam jeden problem do stosu s2 muszę przekopiować zawartość stosu s1. Ale do stosu s2 kopiuje elementy od tyłu, a chcę od przodu aby potem stosem s2 wyświetlało stos s1. Da się ?

Kopiuj
#include <iostream>

using namespace std;

class stack
{
public:
    int m_count;
    int max_size;
    int *tablica;

    ////////////////////////////////////////////////////////////////////////

    void init(int max)
    {
        max_size = max;
        m_count = 0;
        tablica = new int [max_size];
    }

    ////////////////////////////////////////////////////////////////////////

    bool empty()
    {
        return m_count == 0;  // !m_count
    }

    ////////////////////////////////////////////////////////////////////////

    bool full()
    {
        return m_count == max_size;
    }

    ////////////////////////////////////////////////////////////////////////

    void destroy()
    {
        while(Pop());
    }

    ////////////////////////////////////////////////////////////////////////

    void Push(int number)
    {
        if(m_count < max_size)
        {
            tablica[m_count++] = number;
        }

    }

    ////////////////////////////////////////////////////////////////////////

    int Top(void)
    {
        if(m_count)
        {
            return tablica[--m_count];
        }

    }

    ////////////////////////////////////////////////////////////////////////

    int Pop()
    {
        if(m_count)
        {
            --m_count;
            return 1;
        }
        else return 0;
    }

};
int main()
{
    int number_user;
    int count_number;

    cout << "Podaj ilosc liczb ktore chcesz wlozyc na stos: ";
    cin >> count_number;

    stack s1;
    stack s2;
    s2.init(10);
    s1.init(count_number);

    cout << "\nPodawaj kolejne liczby stosu\n\n";
    for(int i = 0; i < count_number; ++i)
    {
        cin >> number_user;
        s1.Push(number_user);
    }

    for(int i = 0; i < count_number; ++i)
    {
       s2.Push(s1.Top());
    }

    cout << s2.Top();



    return 0;

}
 
SO
  • Rejestracja: dni
  • Ostatnio: dni
1

Z tym top i pop to coś namieszałeś.

To pop powinno zrzucić element z wierzchołka stosu, a w twoim kodzie to zwraca 1 albo 0.
top, a poprawniej to byłoby peek powinno zwracać element z wierzchołka stosu nie usuwając go.

I dlaczego nie zrobisz normalnego konstruktora tylko jakieś init ?

N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
0

Miałem polecenie aby był bez konstruktorów. Co do zwracania 1 i 0 w topie, to dlatego bo w funkcji destroy mam pętle

Kopiuj
while(Pop());
SO
  • Rejestracja: dni
  • Ostatnio: dni
0

Ale jaki sens ma w takim razie ta metoda pop ?

Równie dobrze mogłeś w metodzie destroy zamiast :

Kopiuj
 while(Pop()); 

Zrobić:

Kopiuj
 m_count=0;

Teraz masz nieścisłość w nazewnictwie, bo twoje metody nie robią tego na co wskazuje ich nazwa.

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
1

Zdajesz sobie sprawę, że to Twoje Destroy tak naprawdę nic nie robi? :P

N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
0

Tak, kierowałem się stroną lo Tarnów. W funkcji destroy do kolejnych elementów tablicy wpisywać 0 ? Nie mogę używać destruktora.

spartanPAGE
  • Rejestracja: dni
  • Ostatnio: dni
0

Musisz zwalniać pamięć.

N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
0

Destroy ma czyścić pamięć. To nie wiem czy zwalniać pamięć czy wpisywać 0 do poszczególnych elementów tablicy ?

kaczus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Łódź
  • Postów: 1403
0

Zwalniać pamięć powinieneś w destruktorze, a w konstruktorze przydzielać, bądź ustawiać na NULL zmienną tablica.

N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
0

To zwalniać przez destroy czy wpisywać zera do poszczególnych elementów tablicy ? Ten program ma być bez konstruktorów i destruktorów.

kaczus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Łódź
  • Postów: 1403
0

konstruktor i destruktor będzie zawsze, a jeśli jest coś alokowane dynamicznie, to trzeba napisać własny - to jest zasada, którą należy stosować, inaczej będą wycieki pamięci. O ile w systemie z ochroną pamięci, ubijesz program i po krzyku (co najwyżej system podczas działania programu zacznie zwalniać), to czasami ze względów wydajnościowych używasz systemów bez ochrony pamięci, bądź ze szczątkowa i wtedy zakończenie pracy takiego programu nie zwróci nam pamięci! A właśnie programowanie obiektowe powstało między innymi dlatego (po za wszelkimi projektowymi rzeczami), aby ograniczyć wycieki, aby moc to zautomatyzować.

N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
0

Czy teraz jest dobrze ?:

Kopiuj
#include <iostream>

using namespace std;

struct stack
{
public:
    int m_count;
    int max_size;
    int *tablica;

    ////////////////////////////////////////////////////////////////////////

    void init(int max)
    {
        max_size = max;
        m_count = 0;
        tablica = new int [max_size];
    }

    ////////////////////////////////////////////////////////////////////////

    bool empty()
    {
        return m_count == 0;  // !m_count
    }

    ////////////////////////////////////////////////////////////////////////

    bool full()
    {
        return m_count == max_size;
    }

    ////////////////////////////////////////////////////////////////////////

    void destroy()
    {
        delete [] tablica ;
    }

    ////////////////////////////////////////////////////////////////////////

    void Push(int number)
    {
        if(m_count < max_size)
        {
            tablica[m_count++] = number;
        }

    }

    ////////////////////////////////////////////////////////////////////////

    int Top(void)
    {
        if(m_count)
        {
            return tablica[--m_count];
        }

    }

    ////////////////////////////////////////////////////////////////////////

    int Pop()
    {
        if(m_count)
        {
            --m_count;
        }
    }

};
int main()
{
    int number_user;
    int count_number;

    cout << "Podaj ilosc liczb ktore chcesz wlozyc na stos: ";
    cin >> count_number;

    stack s1;
    stack s2;

    s1.init(count_number);
    s2.init(count_number);

    cout << "\nPodawaj kolejne liczby stosu\n\n";
    for(int i = 0; i < count_number; ++i)
    {
        cin >> number_user;
        s1.Push(number_user);
    }

    for(int i = 0; i < count_number; ++i)
    {
       s2.Push(s1.Top());
    }

    cout << s2.Top();



    return 0;

}
 
SO
  • Rejestracja: dni
  • Ostatnio: dni
0

Nie, bo metody pop i top nadal nie robią tego co powinny(i na co wskazuje nazwa).

N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
0

top - odczytanie z wierzchołka stosu liczby (tzn. liczby ostatnio położonej)

Wykonuję taką czynność, czemu nie jest ona dobra ?

kaczus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Łódź
  • Postów: 1403
0

top powinna odczytywać, ale nie zdejmować, pop powinna odczytywać i zdejmować. Dodatkowo nie masz obsłużonego błędu przepełnienia i próby zdjęcia z pustego stosu.

N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
0

To w topie dać jeszcze na końcu instrukcję :

Kopiuj
 ++m_count

?

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
0
Kopiuj
tablica[m_count-1];
Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

Nie myślisz.
Po co w ogóle w tym top masz m_count--?

N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
0

Bo m_count pokazuje na pusty element stosu, --m_cout pokazuje na ostatni element stosu.

`dodanie znaczników ``` - @furious programming

SO
  • Rejestracja: dni
  • Ostatnio: dni
1

No to powinno być tak jak pokazał @twonek.

Kopiuj
 m_count-1 
N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
0

faktycznie, dzięki. poza tym program jest ok ?

kaczus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Łódź
  • Postów: 1403
0
nowicjusz35 napisał(a):

faktycznie, dzięki. poza tym program jest ok ?

Jeśli poprawiłeś te błedy, o których była mowa, to jest na to szansa. Masz nieprzewidywalne działania w kilku miejscach - np zwracana niewiadoma wartość.

N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
0
Kopiuj
#include <iostream>
 
using namespace std;
 
struct stack
{
public:
    int m_count;
    int max_size;
    int *tablica;
 
    ////////////////////////////////////////////////////////////////////////
 
    void init(int max)
    {
        max_size = max;
        m_count = 0;
        tablica = new int [max_size];
    }
 
    ////////////////////////////////////////////////////////////////////////
 
    bool empty()
    {
        return m_count == 0;  // !m_count
    }
 
    ////////////////////////////////////////////////////////////////////////
 
    bool full()
    {
        return m_count == max_size;
    }
 
    ////////////////////////////////////////////////////////////////////////
 
    void destroy()
    {
        delete [] tablica ;
    }
 
    ////////////////////////////////////////////////////////////////////////
 
    void Push(int number)
    {
        if(m_count < max_size)
        {
            tablica[m_count++] = number;
        }
 
    }
 
    ////////////////////////////////////////////////////////////////////////
 
    int Top(void)
    {
        if(m_count)
        {
            return tablica[m_count - 1];
        }
 
    }
 
    ////////////////////////////////////////////////////////////////////////
 
    int Pop()
    {
        if(m_count)
        {
            --m_count;
        }
    }
 
};
int main()
{
    int number_user;
    int count_number;
 
    cout << "Podaj ilosc liczb ktore chcesz wlozyc na stos: ";
    cin >> count_number;
 
    stack s1;
    stack s2;
 
    s1.init(count_number);
    s2.init(count_number);
 
    cout << "\nPodawaj kolejne liczby stosu\n\n";
    for(int i = 0; i < count_number; ++i)
    {
        cin >> number_user;
        s1.Push(number_user);
    }
 
    for(int i = 0; i < count_number; ++i)
    {
       s2.Push(s1.Top());
    }
 
    cout << s2.Top();
 
 
 
    return 0;
 
} 

Pop ma tylko zdejmować, tak mam w zadaniu. Coś jeszcze poprawić?

SO
  • Rejestracja: dni
  • Ostatnio: dni
0

pop powinien też zwracać element z wierzchołka.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.