I've implemented a stack using a singly linked list and would like to know if there are any things I could improve on. Thank you!
StackList.h:
#ifndef STACKLIST_H
#define STACKLIST_H
#include <iostream>
class Node
{
public:
Node() : data(0), next(nullptr) {}
Node(int theData, Node *newPtrToNext)
: data(theData), next(newPtrToNext) {}
Node* getNext() const { return next; }
int getData() const { return data; }
void setData(int theData) { data = theData; }
void setNext(Node *newPtrToNext)
{
next = newPtrToNext;
}
~Node() {}
private:
int data;
Node *next;
};
class StackList
{
public:
//default constructor
StackList();
//copy constructor
StackList(const StackList& otherStack);
//overloaded assignment operator
StackList& operator=(const StackList& otherStack);
//destroyStack
void destroyStack();
//destructor
~StackList();
//size
int size() const;
//push
void push(int newVal);
//pop
void pop();
//top
int top() const;
//empty
bool empty() const;
private:
Node * topOfStack;
int count;
};
#endif
StackList.cpp:
#include "StackList.h"
//default constructor
StackList::StackList()
{
topOfStack = nullptr;
count = 0;
}
//copy constructor
StackList::StackList(const StackList& otherStack)
{
Node* temp = otherStack.topOfStack;
topOfStack = new Node(temp->getData(), nullptr);
Node * prev = topOfStack;
temp = temp->getNext();
while (temp != nullptr)
{
Node * current = new Node(temp->getData(), nullptr);
prev->setNext(current);
prev = prev->getNext();
temp = temp->getNext();
}
count = otherStack.count;
}
//overloaded assignment operator
StackList& StackList::operator=(const StackList& otherStack)
{
if (&otherStack != this)
{
destroyStack();
Node* temp = otherStack.topOfStack;
topOfStack = new Node(temp->getData(), nullptr);
Node * prev = topOfStack;
temp = temp->getNext();
while (temp != nullptr)
{
Node * current = new Node(temp->getData(), nullptr);
prev->setNext(current);
prev = prev->getNext();
temp = temp->getNext();
}
count = otherStack.count;
}
else
std::cerr << "Error. Attempted assignment to itself." << std::endl;
return *this;
}
//destroyStack
void StackList::destroyStack()
{
Node *temp = topOfStack;
while (topOfStack != nullptr)
{
topOfStack = topOfStack->getNext();
delete temp;
temp = topOfStack;
}
count = 0;
}
//destructor
StackList::~StackList()
{
destroyStack();
}
//size
int StackList::size() const
{
return count;
}
//push
void StackList::push(int newVal)
{
topOfStack = new Node(newVal, topOfStack);
count++;
}
//top
int StackList::top() const
{
return topOfStack->getData();
}
//pop
void StackList::pop()
{
if (topOfStack != nullptr)
{
Node * temp = topOfStack;
topOfStack = topOfStack->getNext();
delete temp;
count--;
}
else
std::cerr << "Stack is empty. No value to pop." << std::endl;
}
//empty
bool StackList::empty() const
{
return count == 0;
}