Add RD for a queuelist class using templates
This commit is contained in:
parent
4fe1fc106b
commit
23eb29ea0d
|
@ -19,10 +19,10 @@ int main()
|
||||||
{
|
{
|
||||||
std::cout << "Driver: \n";
|
std::cout << "Driver: \n";
|
||||||
|
|
||||||
StackList testList;
|
StackList<TYPE> testList;
|
||||||
bool exit = false;
|
bool exit = false;
|
||||||
int choice = -1;
|
int choice = -1;
|
||||||
int val;
|
TYPE val;
|
||||||
|
|
||||||
while (!exit)
|
while (!exit)
|
||||||
{
|
{
|
||||||
|
|
|
@ -21,7 +21,8 @@
|
||||||
*
|
*
|
||||||
* @param rhs StackList object
|
* @param rhs StackList object
|
||||||
*/
|
*/
|
||||||
StackList::StackList(const StackList& rhs)
|
template <typename T>
|
||||||
|
StackList<T>::StackList(const StackList<T>& rhs)
|
||||||
{
|
{
|
||||||
Node *cp = rhs.head;
|
Node *cp = rhs.head;
|
||||||
Node *tempHead;
|
Node *tempHead;
|
||||||
|
@ -50,7 +51,8 @@ StackList::StackList(const StackList& rhs)
|
||||||
* @param rhs StackList object passed by value
|
* @param rhs StackList object passed by value
|
||||||
* @return StackList A deep copy of the rhs StackList object
|
* @return StackList A deep copy of the rhs StackList object
|
||||||
*/
|
*/
|
||||||
StackList StackList::operator=(StackList rhs)
|
template <typename T>
|
||||||
|
StackList<T> StackList<T>::operator=(StackList<T> rhs)
|
||||||
{
|
{
|
||||||
if (this == &rhs) return *this;
|
if (this == &rhs) return *this;
|
||||||
// Swap the pointers, moving the previous head data to the local variable rhs
|
// Swap the pointers, moving the previous head data to the local variable rhs
|
||||||
|
@ -61,7 +63,8 @@ StackList StackList::operator=(StackList rhs)
|
||||||
/** destructor
|
/** destructor
|
||||||
* @brief Destroy the StackList::StackList object
|
* @brief Destroy the StackList::StackList object
|
||||||
*/
|
*/
|
||||||
StackList::~StackList()
|
template <typename T>
|
||||||
|
StackList<T>::~StackList()
|
||||||
{
|
{
|
||||||
makeEmpty(head);
|
makeEmpty(head);
|
||||||
}
|
}
|
||||||
|
@ -76,7 +79,8 @@ StackList::~StackList()
|
||||||
*
|
*
|
||||||
* @param val The value to be inserted
|
* @param val The value to be inserted
|
||||||
*/
|
*/
|
||||||
bool StackList::push(int val)
|
template <typename T>
|
||||||
|
bool StackList<T>::push(T val)
|
||||||
{
|
{
|
||||||
bool inserted = push(val, head);
|
bool inserted = push(val, head);
|
||||||
if (inserted)
|
if (inserted)
|
||||||
|
@ -88,35 +92,38 @@ bool StackList::push(int val)
|
||||||
/** pop
|
/** pop
|
||||||
* @brief returns the value at the StackList::head
|
* @brief returns the value at the StackList::head
|
||||||
*
|
*
|
||||||
* @return int The value held at the Node pointed to by StackList::head
|
* @return T The value held at the Node pointed to by StackList::head
|
||||||
*/
|
*/
|
||||||
int StackList::pop()
|
template <typename T>
|
||||||
|
T StackList<T>::pop()
|
||||||
{
|
{
|
||||||
if (!isEmpty())
|
if (!isEmpty())
|
||||||
std::cout << "[" << pop(head) << "] has been popped from our stack\n";
|
std::cout << "[" << pop(head) << "] has been popped from our stack\n";
|
||||||
else std::cout << "Nothing to pop, our stack is empty...\n";
|
else std::cout << "Nothing to pop, our stack is empty...\n";
|
||||||
// If the stack has data we return it, otherwise we return the smallest possible int (error)
|
// If the stack has data we return it, otherwise we return the smallest possible int (error)
|
||||||
return (!isEmpty()) ? head->data : INT32_MIN;
|
return (!isEmpty()) ? head->data : T();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** top
|
/** top
|
||||||
* @brief returns the value at the StackList::head
|
* @brief returns the value at the StackList::head
|
||||||
*
|
*
|
||||||
* @return int The value held at the Node pointed to by StackList::head
|
* @return T The value held at the Node pointed to by StackList::head
|
||||||
*/
|
*/
|
||||||
int StackList::top() const
|
template <typename T>
|
||||||
|
T StackList<T>::top() const
|
||||||
{
|
{
|
||||||
if (!isEmpty())
|
if (!isEmpty())
|
||||||
std::cout << "[" << head->data << "] is at the top of our stack\n";
|
std::cout << "[" << head->data << "] is at the top of our stack\n";
|
||||||
else std::cout << "Our stack is empty...\n";
|
else std::cout << "Our stack is empty...\n";
|
||||||
// If the stack has data we return it, otherwise we return the smallest possible int (error)
|
// If the stack has data we return it, otherwise we return the smallest possible int (error)
|
||||||
return (!isEmpty()) ? head->data : INT32_MIN;
|
return (!isEmpty()) ? head->data : T();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** makeEmpty
|
/** makeEmpty
|
||||||
* @brief Empty this StackList object, deleting all associated Nodes
|
* @brief Empty this StackList object, deleting all associated Nodes
|
||||||
*/
|
*/
|
||||||
void StackList::makeEmpty()
|
template <typename T>
|
||||||
|
void StackList<T>::makeEmpty()
|
||||||
{
|
{
|
||||||
Node *nextNode, *temp;
|
Node *nextNode, *temp;
|
||||||
|
|
||||||
|
@ -141,7 +148,8 @@ void StackList::makeEmpty()
|
||||||
* @return true If the StackList::head is NULL
|
* @return true If the StackList::head is NULL
|
||||||
* @return false If the StackList::head contains data
|
* @return false If the StackList::head contains data
|
||||||
*/
|
*/
|
||||||
bool StackList::isEmpty() const
|
template <typename T>
|
||||||
|
bool StackList<T>::isEmpty() const
|
||||||
{
|
{
|
||||||
return head == NULL;
|
return head == NULL;
|
||||||
}
|
}
|
||||||
|
@ -150,7 +158,8 @@ bool StackList::isEmpty() const
|
||||||
* @brief Output the data held by the StackList object
|
* @brief Output the data held by the StackList object
|
||||||
* Calls to the private print()
|
* Calls to the private print()
|
||||||
*/
|
*/
|
||||||
void StackList::print() const
|
template <typename T>
|
||||||
|
void StackList<T>::print() const
|
||||||
{
|
{
|
||||||
if(!isEmpty()) print(head);
|
if(!isEmpty()) print(head);
|
||||||
else std::cout << "Nothing to print, our stack is empty...\n";
|
else std::cout << "Nothing to print, our stack is empty...\n";
|
||||||
|
@ -169,7 +178,8 @@ void StackList::print() const
|
||||||
* @return true If the value was inserted
|
* @return true If the value was inserted
|
||||||
* @return false If the value could not be inserted
|
* @return false If the value could not be inserted
|
||||||
*/
|
*/
|
||||||
bool StackList::push(int val, Node *&head)
|
template <typename T>
|
||||||
|
bool StackList<T>::push(T val, Node *&head)
|
||||||
{
|
{
|
||||||
Node *newNode = new Node(val);
|
Node *newNode = new Node(val);
|
||||||
// If the stack is not empty, update next pointer to head node
|
// If the stack is not empty, update next pointer to head node
|
||||||
|
@ -183,13 +193,14 @@ bool StackList::push(int val, Node *&head)
|
||||||
* @brief Private member to handle removing the head node from the stack
|
* @brief Private member to handle removing the head node from the stack
|
||||||
*
|
*
|
||||||
* @param head The head node of the stack
|
* @param head The head node of the stack
|
||||||
* @return The last known value held at the head node before removal
|
* @return T The last known value held at the head node before removal
|
||||||
*/
|
*/
|
||||||
int StackList::pop(Node *&head)
|
template <typename T>
|
||||||
|
T StackList<T>::pop(Node *&head)
|
||||||
{
|
{
|
||||||
// We already know the stack is not empty from public pop()
|
// We already know the stack is not empty from public pop()
|
||||||
Node *temp = head;
|
Node *temp = head;
|
||||||
int data = temp->data;
|
T data = temp->data;
|
||||||
head = head->next;
|
head = head->next;
|
||||||
delete temp;
|
delete temp;
|
||||||
return data;
|
return data;
|
||||||
|
@ -200,7 +211,8 @@ int StackList::pop(Node *&head)
|
||||||
*
|
*
|
||||||
* @param start The Node to begin traversing output from
|
* @param start The Node to begin traversing output from
|
||||||
*/
|
*/
|
||||||
void StackList::print(Node *start) const
|
template <typename T>
|
||||||
|
void StackList<T>::print(Node *start) const
|
||||||
{
|
{
|
||||||
Node *temp = start;
|
Node *temp = start;
|
||||||
std::cout << "Stack Contents: ";
|
std::cout << "Stack Contents: ";
|
||||||
|
@ -216,9 +228,9 @@ void StackList::print(Node *start) const
|
||||||
* Does not print any output. Avoids destructors printing to cout
|
* Does not print any output. Avoids destructors printing to cout
|
||||||
*
|
*
|
||||||
* @param head The head of the stack to be deleted
|
* @param head The head of the stack to be deleted
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
void StackList::makeEmpty(Node *&head)
|
template <typename T>
|
||||||
|
void StackList<T>::makeEmpty(Node *&head)
|
||||||
{
|
{
|
||||||
Node *nextNode, *temp;
|
Node *nextNode, *temp;
|
||||||
|
|
||||||
|
@ -236,3 +248,5 @@ void StackList::makeEmpty(Node *&head)
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template class StackList<TYPE>;
|
||||||
|
|
|
@ -13,29 +13,33 @@
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
|
||||||
|
#define TYPE std::string
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
class StackList {
|
class StackList {
|
||||||
public:
|
public:
|
||||||
StackList() : head(NULL) {};
|
StackList() : head(NULL) {};
|
||||||
StackList(const StackList& rhs);
|
StackList(const StackList<T>& rhs);
|
||||||
StackList operator=(StackList rhs);
|
StackList operator=(StackList<T> rhs);
|
||||||
~StackList();
|
~StackList();
|
||||||
bool push(int val);
|
bool push(T val);
|
||||||
int pop();
|
T pop();
|
||||||
int top() const;
|
T top() const;
|
||||||
bool isEmpty() const;
|
bool isEmpty() const;
|
||||||
void print() const;
|
void print() const;
|
||||||
void makeEmpty();
|
void makeEmpty();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct Node {
|
struct Node {
|
||||||
int data;
|
TYPE data;
|
||||||
Node *next;
|
Node *next;
|
||||||
Node(): data(), next(NULL) {};
|
Node(): data(), next(NULL) {};
|
||||||
Node(int val): data(val), next(NULL) {};
|
Node(TYPE val): data(val), next(NULL) {};
|
||||||
};
|
};
|
||||||
Node *head;
|
Node *head;
|
||||||
bool push(int val, Node *&head);
|
bool push(T val, Node *&head);
|
||||||
int pop(Node *&head);
|
T pop(Node *&head);
|
||||||
void print(Node *start) const;
|
void print(Node *start) const;
|
||||||
void makeEmpty(Node *&head);
|
void makeEmpty(Node *&head);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue