Witam, mam problem z utworzeniem stosu który przechowuje elementy w dynamicznej tabeli.
Jest to zadanie z książki Język c++ szkoła programowania wydanie VI dokłaknie zadanie 4 ze strony 620.
Treść:
Dany jest wariant klasy Stack z listingu 10.10:
// stack.h -- definicja klasy stosu (wg ADT)
#ifndef STACK_H_
#define STACK_H_
typedef unsigned long Item;
class Stack
{
private:
enum { MAX = 10}; // stała zasięgu klasy
Item * pitems; // przechowuje elementy stosu
int size;
int top; // indeks szczytowego elementu stosu
public:
Stack(int n = MAX);
Stack(const Stack & s);
~Stack();
bool isempty() const;
bool isfull() const;
// push() zwraca false, jeśli stos jest już pełen (true w pozostałych przypadkach)
bool push(const Item & item); // odkłada element na stos
// pop() zwraca false, jeśli stos jest już pusty (true w pozostałych przypadkach)
bool pop(Item & item); // zdejmuje element ze stosu
Stack & operator=(const Stack & st);
};
#endif
Z zadeklarowanych składowych prywatnych wynika, że klasa wykorzystuje do przechowywania elementów stosu przydzielaną dynamicznie tablicę. Dostosuj implementacje metod klasy do nowej reprezentacji danych i napisz program który będzie demonstrował działanie wszystkich metod, w tym metod konstruktora kopiującego i operatora przypisania.
Oto moje niestety niedziałające rozwiązanie:
// stack.cpp -- metody klasy stosu
#include "stack.h"
#include <iostream>
Stack::Stack(int n) // tworzy pusty stos
{
size = n;
top = 0;
pitems = nullptr;
}
Stack::Stack(const Stack & s)
{
pitems = new Item [s.top+1];
for (int i = 0; i < sizeof(s.pitems) / sizeof(Item); ++i)
pitems[i] = s.pitems[i];
top = s.top + 1;
}
Stack::~Stack()
{
delete [] pitems;
}
bool Stack::isempty() const
{
return top == 0;
}
bool Stack::isfull() const
{
return top == MAX;
}
bool Stack::push(const Item & item)
{
if (top < size)
{
Item temp[top+1];
for(int i = 0; i < top; ++i)
{
temp[i] = pitems[i];
}
delete [] pitems;
pitems = new Item[top + 1];
for(int i = 0; i < top; ++i)
{
pitems[i] = temp[i];
}
++top;
std::cout << top;
pitems[top] = item;
return true;
}
else
return false;
}
bool Stack::pop(Item & item)
{
if (top > 0)
{
item = pitems[top];
Item temp[top];
for(int i = 0; i < top; ++i)
{
temp[i] = pitems[i];
}
delete [] pitems;
--top;
pitems = new Item[top];
for (int i = 0; i < top; ++i)
pitems[i] = temp[i+1];
return true;
}
else
{
delete [] pitems;
return false;
}
}
Stack & Stack::operator=(const Stack & s)
{
if(this == &s)
return *this;
delete [] pitems;
pitems = new Item [s.top+1];
for (int i = 0; i < sizeof(s.pitems) / sizeof(Item); ++i)
pitems[i] = s.pitems[i];
top = s.top + 1;
return *this;
}
#include <iostream>
#include "stack.h"
using namespace std;
int main()
{
cout << "elo";
Stack example;
for (int i = 0; i < 10; ++i)
{
cout << example.push(i);
}
for (unsigned long item = 0; item < 10; ++item)
{
cout << example.pop(item);
}
return 0;
}
Kod kompiluje się, jednak program wypluwa to:
free(): invalid next size (fast): (jakis adres)
Memory map:
...
elo112131Aborted (core dumped)
process returned 134 (0x86)
Chciałbym się dowiedzieć co zrobiłem źle i jak poprawić metody pop i push tak abym nie musiał za każdym razem wrzucać tablicę do zmiennej tymczasowej, usuwał ją i inicjalizował wartościami. Mam nadzieję, że istnieje wydajniejszy sposób.