forked from TheAlgorithms/C-Plus-Plus
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[fix/docs]: remove memory leak in queue (TheAlgorithms#2417)
* fix: remove memory leak in queue * updating DIRECTORY.md * clang-format and clang-tidy fixes for effd74c * style: simplify logic while using reserve * style: use value_type as return type in front * style: use proper error message * style: use pre-increment and pre-decrement * docs: use doxygen syntax * docs: improve wording Co-authored-by: github-actions[bot] <github-actions@users.noreply.github.com> Co-authored-by: David Leal <halfpacho@gmail.com>
- Loading branch information
1 parent
5b23872
commit 7c09048
Showing
7 changed files
with
250 additions
and
161 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
/** | ||
* @file | ||
* @brief Provides Node class and related utilities | ||
**/ | ||
#ifndef DATA_STRUCTURES_NODE_HPP_ | ||
#define DATA_STRUCTURES_NODE_HPP_ | ||
|
||
#include <iostream> /// for std::cout | ||
#include <memory> /// for std::shared_ptr | ||
#include <vector> /// for std::vector | ||
|
||
/** Definition of the node as a linked-list | ||
* \tparam ValueType type of data nodes of the linked list should contain | ||
*/ | ||
template <class ValueType> | ||
struct Node { | ||
using value_type = ValueType; | ||
ValueType data = {}; | ||
std::shared_ptr<Node<ValueType>> next = {}; | ||
}; | ||
|
||
template <typename Node, typename Action> | ||
void traverse(const Node* const inNode, const Action& action) { | ||
if (inNode) { | ||
action(*inNode); | ||
traverse(inNode->next.get(), action); | ||
} | ||
} | ||
|
||
template <typename Node> | ||
void display_all(const Node* const inNode) { | ||
traverse(inNode, | ||
[](const Node& curNode) { std::cout << curNode.data << " "; }); | ||
} | ||
|
||
template <typename Node> | ||
std::vector<typename Node::value_type> push_all_to_vector( | ||
const Node* const inNode, const std::size_t expected_size = 0) { | ||
std::vector<typename Node::value_type> res; | ||
res.reserve(expected_size); | ||
traverse(inNode, | ||
[&res](const Node& curNode) { res.push_back(curNode.data); }); | ||
return res; | ||
} | ||
|
||
#endif // DATA_STRUCTURES_NODE_HPP_ |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
/* This class specifies the basic operation on a queue as a linked list */ | ||
#ifndef DATA_STRUCTURES_QUEUE_HPP_ | ||
#define DATA_STRUCTURES_QUEUE_HPP_ | ||
|
||
#include "node.hpp" | ||
|
||
/** Definition of the queue class */ | ||
template <class ValueType> | ||
class queue { | ||
using node_type = Node<ValueType>; | ||
|
||
public: | ||
using value_type = ValueType; | ||
/** | ||
* @brief prints the queue into the std::cout | ||
*/ | ||
void display() const { | ||
std::cout << "Front --> "; | ||
display_all(this->queueFront.get()); | ||
std::cout << '\n'; | ||
std::cout << "Size of queue: " << size << '\n'; | ||
} | ||
|
||
/** | ||
* @brief converts the queue into the std::vector | ||
* @return std::vector containning all of the elements of the queue in the | ||
* same order | ||
*/ | ||
std::vector<value_type> toVector() const { | ||
return push_all_to_vector(this->queueFront.get(), this->size); | ||
} | ||
|
||
private: | ||
/** | ||
* @brief throws an exception if queue is empty | ||
* @exception std::invalid_argument if queue is empty | ||
*/ | ||
void ensureNotEmpty() const { | ||
if (isEmptyQueue()) { | ||
throw std::invalid_argument("Queue is empty."); | ||
} | ||
} | ||
|
||
public: | ||
/** | ||
* @brief checks if the queue has no elements | ||
* @return true if the queue is empty, false otherwise | ||
*/ | ||
bool isEmptyQueue() const { return (queueFront == nullptr); } | ||
|
||
/** | ||
* @brief inserts a new item into the queue | ||
*/ | ||
void enQueue(const value_type& item) { | ||
auto newNode = std::make_shared<node_type>(); | ||
newNode->data = item; | ||
newNode->next = nullptr; | ||
if (isEmptyQueue()) { | ||
queueFront = newNode; | ||
queueRear = newNode; | ||
} else { | ||
queueRear->next = newNode; | ||
queueRear = queueRear->next; | ||
} | ||
++size; | ||
} | ||
|
||
/** | ||
* @return the first element of the queue | ||
* @exception std::invalid_argument if queue is empty | ||
*/ | ||
value_type front() const { | ||
ensureNotEmpty(); | ||
return queueFront->data; | ||
} | ||
|
||
/** | ||
* @brief removes the first element from the queue | ||
* @exception std::invalid_argument if queue is empty | ||
*/ | ||
void deQueue() { | ||
ensureNotEmpty(); | ||
queueFront = queueFront->next; | ||
--size; | ||
} | ||
|
||
/** | ||
* @brief removes all elements from the queue | ||
*/ | ||
void clear() { | ||
queueFront = nullptr; | ||
queueRear = nullptr; | ||
size = 0; | ||
} | ||
|
||
private: | ||
std::shared_ptr<node_type> queueFront = | ||
{}; /**< Pointer to the front of the queue */ | ||
std::shared_ptr<node_type> queueRear = | ||
{}; /**< Pointer to the rear of the queue */ | ||
std::size_t size = 0; | ||
}; | ||
|
||
#endif // DATA_STRUCTURES_QUEUE_HPP_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.