• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Klasa stosu C++

Object Storage Arubacloud
0 głosów
1,995 wizyt
pytanie zadane 13 listopada 2016 w C i C++ przez ewazdomu Początkujący (320 p.)

W jaki sposób do takiej klasy stosu mogę dodać dynamiczną alokację pamięci? 


#define STACKSIZE 20

class stack
{
public:
void push(int a);
int pop();
void clear();
stack();
~stack();
private:
int top;
int dane[STACKSIZE];
};


#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include "stack.h"

stack::stack()
{
	this->top=0;
}

stack::~stack()
{
}

void stack::clear()
{
	this->top=0;
}

void stack::push(int a)
{
	assert(this->top<STACKSIZE);
	this->dane[this->top++]=a;
}

int stack::pop()
{
	assert(this->top>0);
	return this->dane[--this->top];
}

 

komentarz 13 listopada 2016 przez Kasztan Dyskutant (8,080 p.)
Ale w jakim sensie ? Takim, że np stos zaczyna się zapełniać i wtedy alokujesz większą liczbę pamięci ? Czy jak ?
komentarz 13 listopada 2016 przez ewazdomu Początkujący (320 p.)
Tak.
komentarz 13 listopada 2016 przez Kasztan Dyskutant (8,080 p.)
No to własnie tak jak powiedziałem xD a znasz operatory new i delete ?
komentarz 13 listopada 2016 przez ewazdomu Początkujący (320 p.)
No znam, tylko za bardzo w jakim miejscu użyć. Czy alokacja powinna być być w funkcji wrzucania elementów i zwolnienie pamieci w destruktorze czy osobne funkcje powinienem stworzyć?
komentarz 13 listopada 2016 przez Kasztan Dyskutant (8,080 p.)
Ja bym próbował w miejscu wrzucania elementów, popróbuj :) na własnych błędach nauczysz się najwięcej, ja tak robię :)

2 odpowiedzi

0 głosów
odpowiedź 13 listopada 2016 przez criss Mędrzec (172,590 p.)

Po pierwsze nie pisz wszędzie this->. To niepotrzebne i strasznie sie czyta ten kod.

Czy alokacja powinna być być w funkcji wrzucania elementów i zwolnienie pamieci w destruktorze czy osobne funkcje powinienem stworzyć?

To w destruktorze na pewnie nie. Ofc też w destruktorze, ale nie o tym mówimy. Zwalniać będziesz więcej niż raz. Gdy będziesz chciał dodać element, a tablica będzię już wypełniona, to będziesz chciał:

  1. Zaalokować nową, większą tablice.
  2. Przekopiować do nowej tablicy dane ze starej i za przekopiowanymi danymi dokopiować dodawany element.
  3.  Zwolnić starą, niepotrzebną już tablice.

 Więc powyższe kroki powinny być wykonywane w metodzie nazwanej u ciebie push. To czy napiszesz w celu zwalniania i alokacji tablicy osobną metode, to już tylko kwestia przejrzystości kodu czy twojego widzimisie.

–1 głos
odpowiedź 14 listopada 2016 przez Sinnley Stary wyjadacz (12,810 p.)

Przede wszystkim wywal tą tablice. Stos to struktura dynamiczna.

Jakbyś chciał się bawić w robienie stosu w ten sposób, czyli na statycznych danych to równie dobrze mogłeś użyć vectora.

Stos, jako struktura dynamiczna powinien być tworzony jak sama nazwa wskazuje dynamicznie, czyli na wskaźnikach.

Stwórz sobie strukture w następujący sposob:

struct struktura{

struktura * nastepny;

// dane



}

I niech wszystko odbywa się dynamicznie.
Najpierw deklarujesz sobie wskaźnik wsk którym za pomocą operatora new zaalokujesz sobie dynamicznie zmienna typu struktura, oraz jeden wskaznik pomocniczy, nazwijmy go wskpom. Masz wiec wskaznik na pierwsza "cegielke z danymi" na twoim stosie. Kiedy chcesz dodać nowy element do stosu dajesz wskpomowi adres ktory trzyma wsk, zeby ci sie ten adres nie zgubil i za pomoca wsk znowu uzywasz new do zrobienia sobie kolejnej dynamicznej zmiennej typu struktura. Teraz wyjasnia sie po co wskaznik wewnatrz struktury. Wskaznikowi nastepny wewnatrz Twojej nowoutworzonej zmiennej ktorej adres trzyma wsk przypisujesz to co trzyma wskpom, czyli adres cegielki "pod nim" na stosie. I jak chcesz dodać kolejna "cegielke" to znowu, wskpom dostaje adres wsk zebys mial adres elementu na szczycie stosu, wsk alokuje nowa zmienna i tak dalej i tak dalej.

Tym sposobem każdy element stosu pamięta adres elementu pod nim, a calosc odbywa sie, jak przystalo na dynamiczna strukture, a jakze, dynamicznie.

Co do usuwania elementow ze stosu, mysle ze domyslasz sie ze trzeba poruszać się wskaźnikami odwrotnie.
Nie wrzuce ci tu gotowego kodu, bo to juz twoje zadanie go napisac ;)
Jesli sa jakies niejasnosci to pytaj.

komentarz 14 listopada 2016 przez Kasztan Dyskutant (8,080 p.)
To o czym piszesz to nie stos :)
komentarz 14 listopada 2016 przez Sinnley Stary wyjadacz (12,810 p.)
A co? :) Jakaś argumentacja?

Ja w tym co przekazałem widzę dynamiczną kolejkę LIFO - stos.

Podobne pytania

0 głosów
1 odpowiedź 202 wizyt
pytanie zadane 14 listopada 2021 w C i C++ przez pawel_000 Początkujący (450 p.)
0 głosów
0 odpowiedzi 139 wizyt
pytanie zadane 24 września 2022 w Systemy operacyjne, programy przez Patrykosik88 Początkujący (340 p.)
0 głosów
1 odpowiedź 373 wizyt
pytanie zadane 19 maja 2021 w C i C++ przez hassan00 Nowicjusz (130 p.)

92,640 zapytań

141,516 odpowiedzi

319,907 komentarzy

62,018 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...