mirror of
https://hub.njuu.cf/TheAlgorithms/C-Plus-Plus.git
synced 2023-10-11 13:05:55 +08:00
e2bf654e82
* fix: remove memory leak in stack * style: use camelCase * style: simplify logic * style: rename stack.h to stack.hpp * updating DIRECTORY.md * clang-format and clang-tidy fixes for2205c6f1
* fix: remove redundant file name Co-authored-by: David Leal <halfpacho@gmail.com> * clang-format and clang-tidy fixes fora080aaa2
* refactor: use std::shared_ptr * fix: use C++11 * chore: synchronize with master (#2) * chore: fix Markdown formatting in `dynamic_programming/kadane2.cpp` (#2276) * docs: fix grammatical errors and typos (#2201) * docs: fix grammatical errors and typos * compilation error fixed * Revert "compilation error fixed" This reverts commit0083cbfd1a
. * feat: added physics directory and ground to ground projectile motion algorithm (#2279) * feat: added physics folder, ground to ground projectile motion calculations * feat: added max height function * fix: bug in angle calculations * test: added test cases * docs: added comments to test case variables * docs: added comments to calculations * fix: changed floats to doubles * updating DIRECTORY.md * Update physics/ground_to_ground_projectile_motion.cpp Co-authored-by: David Leal <halfpacho@gmail.com> * chore: add missing namespace * rerun checks Co-authored-by: David <Panquesito7@users.noreply.github.com> Co-authored-by: David Leal <halfpacho@gmail.com> * docs: updated a logically wrong doc comment (#2329) * feat: add CMakeLists to the `divide_and_conquer` directory (#2072) * fix: stairs pattern not printing slash (#2111) when we propose 2 backslash then it doesn't take it as a comment and gets printed Co-authored-by: David Leal <halfpacho@gmail.com> * fix: use FreeGlut newest GitHub link (#2397) * updating DIRECTORY.md * fix: use FreeGlut newest GitHub link * chore(fix): `data_strcutres` -> `data_structures` (#2399) * feat: add Find non repeating number implementation (#2061) * add find_single_number * add fix issues * remove .vscode * add .vscode * Update .vscode/settings.json Co-authored-by: David Leal <halfpacho@gmail.com> * chore(fix): minor issues Co-authored-by: David Leal <halfpacho@gmail.com> * [feat/docs]: improve the `quick_sort.cpp` algorithm (#2396) * [feat/docs]: improve the `quick_sort.cpp`... ...algorithm implementation. * clang-format and clang-tidy fixes for 40c858ba * chore(fix): add original author * updating DIRECTORY.md * chore: update Discord links (#2407) * docs: remove unneeded Markdown header * feat: improve the Awesome Workflow (#2408) * fix: Awesome Workflow issues Thanks to @tjgurwara99 for the original fix: TheAlgorithms/C#1176 * chore: apply suggestions from code review Co-authored-by: Taj <tjgurwara99@users.noreply.github.com> * feat: various improvements * chore: apply suggestions from code review Co-authored-by: Taj <tjgurwara99@users.noreply.github.com> * chore: remove LGTM and fix... ...CodeQL badges. * docs: add guide on integrating CMake (#2410) Taken from TheAlgorithms/C#1163 * updating DIRECTORY.md Co-authored-by: Daemon <90456722+Daemon19@users.noreply.github.com> Co-authored-by: aadarshkt <72285744+aadarshkt@users.noreply.github.com> Co-authored-by: Focus <65309793+Focusucof@users.noreply.github.com> Co-authored-by: David <Panquesito7@users.noreply.github.com> Co-authored-by: David Leal <halfpacho@gmail.com> Co-authored-by: Arjit Malik <arjitmalik2001@gmail.com> Co-authored-by: Harsh Singh <94822101+harshsingh510@users.noreply.github.com> Co-authored-by: Ravi Dev Pandey <62198564+literalEval@users.noreply.github.com> Co-authored-by: Mehmet <110852769+walterwhite351@users.noreply.github.com> Co-authored-by: Taj <tjgurwara99@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions@users.noreply.github.com> * docs: update authors and include comments apply suggestions of @Panquesito7 Co-authored-by: David Leal <halfpacho@gmail.com> * style: apply clang-format * clang-format and clang-tidy fixes forb35b7214
* style: make display and isEmptyStack const * tests: remove test_stack_legacy.cpp * style: throw invalid_argument from top and pop if stack empty * updating DIRECTORY.md * style: add missing include docs, remove cassert * style: use assert macro, document includes * fix: use const reference in lambdas in display and toVector * style: remove shared_ptr from traverse Co-authored-by: David Leal <halfpacho@gmail.com> Co-authored-by: Daemon <90456722+Daemon19@users.noreply.github.com> Co-authored-by: aadarshkt <72285744+aadarshkt@users.noreply.github.com> Co-authored-by: Focus <65309793+Focusucof@users.noreply.github.com> Co-authored-by: Arjit Malik <arjitmalik2001@gmail.com> Co-authored-by: Harsh Singh <94822101+harshsingh510@users.noreply.github.com> Co-authored-by: Ravi Dev Pandey <62198564+literalEval@users.noreply.github.com> Co-authored-by: Mehmet <110852769+walterwhite351@users.noreply.github.com> Co-authored-by: Taj <tjgurwara99@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions@users.noreply.github.com>
107 lines
2.8 KiB
C++
107 lines
2.8 KiB
C++
/**
|
|
* @file
|
|
* @author danghai
|
|
* @author [Piotr Idzik](https://github.com/vil02)
|
|
* @brief This class specifies the basic operation on a stack as a linked list
|
|
**/
|
|
#ifndef DATA_STRUCTURES_STACK_HPP_
|
|
#define DATA_STRUCTURES_STACK_HPP_
|
|
|
|
#include <iostream> /// for IO operations
|
|
#include <memory> /// for std::shared_ptr
|
|
#include <stdexcept> /// for std::invalid_argument
|
|
#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 {
|
|
ValueType data = {}; ///< data at current node
|
|
std::shared_ptr<node<ValueType>> next =
|
|
{}; ///< pointer to the next ::node instance
|
|
};
|
|
|
|
template <typename Node, typename Action>
|
|
void traverse(const Node* const inNode, const Action& action) {
|
|
if (inNode) {
|
|
action(*inNode);
|
|
traverse(inNode->next.get(), action);
|
|
}
|
|
}
|
|
|
|
/** Definition of the stack class
|
|
* \tparam value_type type of data nodes of the linked list in the stack should
|
|
* contain
|
|
*/
|
|
template <class ValueType>
|
|
class stack {
|
|
public:
|
|
using value_type = ValueType;
|
|
|
|
/** Show stack */
|
|
void display() const {
|
|
std::cout << "Top --> ";
|
|
traverse(stackTop.get(), [](const node<value_type>& inNode) {
|
|
std::cout << inNode.data << " ";
|
|
});
|
|
std::cout << std::endl;
|
|
std::cout << "Size of stack: " << size << std::endl;
|
|
}
|
|
|
|
std::vector<value_type> toVector() const {
|
|
std::vector<value_type> res;
|
|
res.reserve(this->size);
|
|
traverse(stackTop.get(), [&res](const node<value_type>& inNode) {
|
|
res.push_back(inNode.data);
|
|
});
|
|
return res;
|
|
}
|
|
|
|
private:
|
|
void ensureNotEmpty() const {
|
|
if (isEmptyStack()) {
|
|
throw std::invalid_argument("Stack is empty.");
|
|
}
|
|
}
|
|
|
|
public:
|
|
/** Determine whether the stack is empty */
|
|
bool isEmptyStack() const { return (stackTop == nullptr); }
|
|
|
|
/** Add new item to the stack */
|
|
void push(const value_type& item) {
|
|
auto newNode = std::make_shared<node<value_type>>();
|
|
newNode->data = item;
|
|
newNode->next = stackTop;
|
|
stackTop = newNode;
|
|
size++;
|
|
}
|
|
|
|
/** Return the top element of the stack */
|
|
value_type top() const {
|
|
ensureNotEmpty();
|
|
return stackTop->data;
|
|
}
|
|
|
|
/** Remove the top element of the stack */
|
|
void pop() {
|
|
ensureNotEmpty();
|
|
stackTop = stackTop->next;
|
|
size--;
|
|
}
|
|
|
|
/** Clear stack */
|
|
void clear() {
|
|
stackTop = nullptr;
|
|
size = 0;
|
|
}
|
|
|
|
private:
|
|
std::shared_ptr<node<value_type>> stackTop =
|
|
{}; /**< Pointer to the stack */
|
|
std::size_t size = 0; ///< size of stack
|
|
};
|
|
|
|
#endif // DATA_STRUCTURES_STACK_HPP_
|