mirror of
https://hub.njuu.cf/TheAlgorithms/C-Plus-Plus.git
synced 2023-10-11 13:05:55 +08:00
[feat/fix]: improve the data stack implementations (#2235)
* 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>
This commit is contained in:
parent
582cdc7cc4
commit
e2bf654e82
@ -66,7 +66,7 @@
|
|||||||
* [Reverse A Linked List](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/data_structures/reverse_a_linked_list.cpp)
|
* [Reverse A Linked List](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/data_structures/reverse_a_linked_list.cpp)
|
||||||
* [Skip List](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/data_structures/skip_list.cpp)
|
* [Skip List](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/data_structures/skip_list.cpp)
|
||||||
* [Sparse Table](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/data_structures/sparse_table.cpp)
|
* [Sparse Table](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/data_structures/sparse_table.cpp)
|
||||||
* [Stack](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/data_structures/stack.h)
|
* [Stack](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/data_structures/stack.hpp)
|
||||||
* [Stack Using Array](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/data_structures/stack_using_array.cpp)
|
* [Stack Using Array](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/data_structures/stack_using_array.cpp)
|
||||||
* [Stack Using Linked List](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/data_structures/stack_using_linked_list.cpp)
|
* [Stack Using Linked List](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/data_structures/stack_using_linked_list.cpp)
|
||||||
* [Stack Using Queue](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/data_structures/stack_using_queue.cpp)
|
* [Stack Using Queue](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/data_structures/stack_using_queue.cpp)
|
||||||
|
@ -1,150 +0,0 @@
|
|||||||
/**
|
|
||||||
* @file stack.h
|
|
||||||
* @author danghai
|
|
||||||
* @brief This class specifies the basic operation on a stack as a linked list
|
|
||||||
**/
|
|
||||||
#ifndef DATA_STRUCTURES_STACK_H_
|
|
||||||
#define DATA_STRUCTURES_STACK_H_
|
|
||||||
|
|
||||||
#include <cassert>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
/** Definition of the node as a linked-list
|
|
||||||
* \tparam Type type of data nodes of the linked list should contain
|
|
||||||
*/
|
|
||||||
template <class Type>
|
|
||||||
struct node {
|
|
||||||
Type data; ///< data at current node
|
|
||||||
node<Type> *next; ///< pointer to the next ::node instance
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Definition of the stack class
|
|
||||||
* \tparam Type type of data nodes of the linked list in the stack should
|
|
||||||
* contain
|
|
||||||
*/
|
|
||||||
template <class Type>
|
|
||||||
class stack {
|
|
||||||
public:
|
|
||||||
/** Show stack */
|
|
||||||
void display() {
|
|
||||||
node<Type> *current = stackTop;
|
|
||||||
std::cout << "Top --> ";
|
|
||||||
while (current != nullptr) {
|
|
||||||
std::cout << current->data << " ";
|
|
||||||
current = current->next;
|
|
||||||
}
|
|
||||||
std::cout << std::endl;
|
|
||||||
std::cout << "Size of stack: " << size << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Default constructor*/
|
|
||||||
stack() {
|
|
||||||
stackTop = nullptr;
|
|
||||||
size = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Copy constructor*/
|
|
||||||
explicit stack(const stack<Type> &otherStack) {
|
|
||||||
node<Type> *newNode, *current, *last;
|
|
||||||
|
|
||||||
/* If stack is no empty, make it empty */
|
|
||||||
if (stackTop != nullptr) {
|
|
||||||
stackTop = nullptr;
|
|
||||||
}
|
|
||||||
if (otherStack.stackTop == nullptr) {
|
|
||||||
stackTop = nullptr;
|
|
||||||
} else {
|
|
||||||
current = otherStack.stackTop;
|
|
||||||
stackTop = new node<Type>;
|
|
||||||
stackTop->data = current->data;
|
|
||||||
stackTop->next = nullptr;
|
|
||||||
last = stackTop;
|
|
||||||
current = current->next;
|
|
||||||
/* Copy the remaining stack */
|
|
||||||
while (current != nullptr) {
|
|
||||||
newNode = new node<Type>;
|
|
||||||
newNode->data = current->data;
|
|
||||||
newNode->next = nullptr;
|
|
||||||
last->next = newNode;
|
|
||||||
last = newNode;
|
|
||||||
current = current->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
size = otherStack.size;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Destructor */
|
|
||||||
~stack() {}
|
|
||||||
|
|
||||||
/** Determine whether the stack is empty */
|
|
||||||
bool isEmptyStack() { return (stackTop == nullptr); }
|
|
||||||
|
|
||||||
/** Add new item to the stack */
|
|
||||||
void push(Type item) {
|
|
||||||
node<Type> *newNode;
|
|
||||||
newNode = new node<Type>;
|
|
||||||
newNode->data = item;
|
|
||||||
newNode->next = stackTop;
|
|
||||||
stackTop = newNode;
|
|
||||||
size++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Return the top element of the stack */
|
|
||||||
Type top() {
|
|
||||||
assert(stackTop != nullptr);
|
|
||||||
return stackTop->data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Remove the top element of the stack */
|
|
||||||
void pop() {
|
|
||||||
node<Type> *temp;
|
|
||||||
if (!isEmptyStack()) {
|
|
||||||
temp = stackTop;
|
|
||||||
stackTop = stackTop->next;
|
|
||||||
delete temp;
|
|
||||||
size--;
|
|
||||||
} else {
|
|
||||||
std::cout << "Stack is empty !" << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Clear stack */
|
|
||||||
void clear() { stackTop = nullptr; }
|
|
||||||
|
|
||||||
/** Overload "=" the assignment operator */
|
|
||||||
stack<Type> &operator=(const stack<Type> &otherStack) {
|
|
||||||
node<Type> *newNode, *current, *last;
|
|
||||||
|
|
||||||
/* If stack is no empty, make it empty */
|
|
||||||
if (stackTop != nullptr) {
|
|
||||||
stackTop = nullptr;
|
|
||||||
}
|
|
||||||
if (otherStack.stackTop == nullptr) {
|
|
||||||
stackTop = nullptr;
|
|
||||||
} else {
|
|
||||||
current = otherStack.stackTop;
|
|
||||||
stackTop = new node<Type>;
|
|
||||||
stackTop->data = current->data;
|
|
||||||
stackTop->next = nullptr;
|
|
||||||
last = stackTop;
|
|
||||||
current = current->next;
|
|
||||||
/* Copy the remaining stack */
|
|
||||||
while (current != nullptr) {
|
|
||||||
newNode = new node<Type>;
|
|
||||||
newNode->data = current->data;
|
|
||||||
newNode->next = nullptr;
|
|
||||||
last->next = newNode;
|
|
||||||
last = newNode;
|
|
||||||
current = current->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
size = otherStack.size;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
node<Type> *stackTop; /**< Pointer to the stack */
|
|
||||||
int size; ///< size of stack
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // DATA_STRUCTURES_STACK_H_
|
|
106
data_structures/stack.hpp
Normal file
106
data_structures/stack.hpp
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/**
|
||||||
|
* @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_
|
@ -1,59 +1,203 @@
|
|||||||
#include <iostream>
|
#include <cassert> /// for assert
|
||||||
|
#include <iostream> /// for std::cout
|
||||||
|
#include <stdexcept> /// std::invalid_argument
|
||||||
|
#include <vector> /// for std::vector
|
||||||
|
|
||||||
#include "./stack.h"
|
#include "./stack.hpp"
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void testConstructedStackIsEmpty() {
|
||||||
|
const stack<T> curStack;
|
||||||
|
assert(curStack.isEmptyStack());
|
||||||
|
}
|
||||||
|
|
||||||
|
void testPush() {
|
||||||
|
using valueType = int;
|
||||||
|
stack<valueType> curStack;
|
||||||
|
curStack.push(10);
|
||||||
|
curStack.push(20);
|
||||||
|
curStack.push(30);
|
||||||
|
curStack.push(40);
|
||||||
|
const auto expectedData = std::vector<valueType>({40, 30, 20, 10});
|
||||||
|
assert(curStack.toVector() == expectedData);
|
||||||
|
}
|
||||||
|
|
||||||
|
void testTop() {
|
||||||
|
using valueType = unsigned;
|
||||||
|
stack<valueType> curStack;
|
||||||
|
curStack.push(1);
|
||||||
|
curStack.push(2);
|
||||||
|
curStack.push(3);
|
||||||
|
curStack.push(4);
|
||||||
|
assert(curStack.top() == static_cast<valueType>(4));
|
||||||
|
}
|
||||||
|
|
||||||
|
void testPop() {
|
||||||
|
using valueType = int;
|
||||||
|
stack<valueType> curStack;
|
||||||
|
curStack.push(100);
|
||||||
|
curStack.push(200);
|
||||||
|
curStack.push(300);
|
||||||
|
|
||||||
|
assert(curStack.top() == static_cast<valueType>(300));
|
||||||
|
curStack.pop();
|
||||||
|
assert(curStack.top() == static_cast<valueType>(200));
|
||||||
|
curStack.pop();
|
||||||
|
assert(curStack.top() == static_cast<valueType>(100));
|
||||||
|
curStack.pop();
|
||||||
|
assert(curStack.isEmptyStack());
|
||||||
|
}
|
||||||
|
|
||||||
|
void testClear() {
|
||||||
|
stack<int> curStack;
|
||||||
|
curStack.push(1000);
|
||||||
|
curStack.push(2000);
|
||||||
|
curStack.clear();
|
||||||
|
assert(curStack.isEmptyStack());
|
||||||
|
}
|
||||||
|
|
||||||
|
void testCopyOfStackHasSameData() {
|
||||||
|
stack<int> stackA;
|
||||||
|
stackA.push(10);
|
||||||
|
stackA.push(200);
|
||||||
|
stackA.push(3000);
|
||||||
|
const auto stackB(stackA);
|
||||||
|
assert(stackA.toVector() == stackB.toVector());
|
||||||
|
}
|
||||||
|
|
||||||
|
void testPushingToCopyDoesNotChangeOriginal() {
|
||||||
|
using valueType = int;
|
||||||
|
stack<valueType> stackA;
|
||||||
|
stackA.push(10);
|
||||||
|
stackA.push(20);
|
||||||
|
stackA.push(30);
|
||||||
|
auto stackB(stackA);
|
||||||
|
stackB.push(40);
|
||||||
|
|
||||||
|
const auto expectedDataA = std::vector<valueType>({30, 20, 10});
|
||||||
|
const auto expectedDataB = std::vector<valueType>({40, 30, 20, 10});
|
||||||
|
|
||||||
|
assert(stackA.toVector() == expectedDataA);
|
||||||
|
assert(stackB.toVector() == expectedDataB);
|
||||||
|
}
|
||||||
|
|
||||||
|
void testPoppingFromCopyDoesNotChangeOriginal() {
|
||||||
|
using valueType = int;
|
||||||
|
stack<valueType> stackA;
|
||||||
|
stackA.push(10);
|
||||||
|
stackA.push(20);
|
||||||
|
stackA.push(30);
|
||||||
|
auto stackB(stackA);
|
||||||
|
stackB.pop();
|
||||||
|
|
||||||
|
const auto expectedDataA = std::vector<valueType>({30, 20, 10});
|
||||||
|
const auto expectedDataB = std::vector<valueType>({20, 10});
|
||||||
|
|
||||||
|
assert(stackA.toVector() == expectedDataA);
|
||||||
|
assert(stackB.toVector() == expectedDataB);
|
||||||
|
}
|
||||||
|
|
||||||
|
void testPushingToOrginalDoesNotChangeCopy() {
|
||||||
|
using valueType = int;
|
||||||
|
stack<valueType> stackA;
|
||||||
|
stackA.push(10);
|
||||||
|
stackA.push(20);
|
||||||
|
stackA.push(30);
|
||||||
|
const auto stackB(stackA);
|
||||||
|
stackA.push(40);
|
||||||
|
|
||||||
|
const auto expectedDataA = std::vector<valueType>({40, 30, 20, 10});
|
||||||
|
const auto expectedDataB = std::vector<valueType>({30, 20, 10});
|
||||||
|
|
||||||
|
assert(stackA.toVector() == expectedDataA);
|
||||||
|
assert(stackB.toVector() == expectedDataB);
|
||||||
|
}
|
||||||
|
|
||||||
|
void testPoppingFromOrginalDoesNotChangeCopy() {
|
||||||
|
using valueType = int;
|
||||||
|
stack<valueType> stackA;
|
||||||
|
stackA.push(10);
|
||||||
|
stackA.push(20);
|
||||||
|
stackA.push(30);
|
||||||
|
const auto stackB(stackA);
|
||||||
|
stackA.pop();
|
||||||
|
|
||||||
|
const auto expectedDataA = std::vector<valueType>({20, 10});
|
||||||
|
const auto expectedDataB = std::vector<valueType>({30, 20, 10});
|
||||||
|
|
||||||
|
assert(stackA.toVector() == expectedDataA);
|
||||||
|
assert(stackB.toVector() == expectedDataB);
|
||||||
|
}
|
||||||
|
|
||||||
|
void testAssign() {
|
||||||
|
using valueType = int;
|
||||||
|
stack<valueType> stackA;
|
||||||
|
stackA.push(10);
|
||||||
|
stackA.push(20);
|
||||||
|
stackA.push(30);
|
||||||
|
stack<valueType> stackB = stackA;
|
||||||
|
stackA.pop();
|
||||||
|
stackB.push(40);
|
||||||
|
|
||||||
|
const auto expectedDataA = std::vector<valueType>({20, 10});
|
||||||
|
const auto expectedDataB = std::vector<valueType>({40, 30, 20, 10});
|
||||||
|
|
||||||
|
assert(stackA.toVector() == expectedDataA);
|
||||||
|
assert(stackB.toVector() == expectedDataB);
|
||||||
|
|
||||||
|
stackB = stackA;
|
||||||
|
stackA.pop();
|
||||||
|
stackB.push(5);
|
||||||
|
stackB.push(6);
|
||||||
|
|
||||||
|
const auto otherExpectedDataA = std::vector<valueType>({10});
|
||||||
|
const auto otherExpectedDataB = std::vector<valueType>({6, 5, 20, 10});
|
||||||
|
|
||||||
|
assert(stackA.toVector() == otherExpectedDataA);
|
||||||
|
assert(stackB.toVector() == otherExpectedDataB);
|
||||||
|
}
|
||||||
|
|
||||||
|
void testTopThrowsAnvalidArgumentWhenStackEmpty() {
|
||||||
|
const stack<long double> curStack;
|
||||||
|
bool wasException = false;
|
||||||
|
try {
|
||||||
|
curStack.top();
|
||||||
|
} catch (const std::invalid_argument&) {
|
||||||
|
wasException = true;
|
||||||
|
}
|
||||||
|
assert(wasException);
|
||||||
|
}
|
||||||
|
|
||||||
|
void testPopThrowsAnvalidArgumentWhenStackEmpty() {
|
||||||
|
stack<bool> curStack;
|
||||||
|
bool wasException = false;
|
||||||
|
try {
|
||||||
|
curStack.pop();
|
||||||
|
} catch (const std::invalid_argument&) {
|
||||||
|
wasException = true;
|
||||||
|
}
|
||||||
|
assert(wasException);
|
||||||
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
stack<int> stk;
|
testConstructedStackIsEmpty<int>();
|
||||||
std::cout << "---------------------- Test construct ----------------------"
|
testConstructedStackIsEmpty<char>();
|
||||||
<< std::endl;
|
|
||||||
stk.display();
|
testPush();
|
||||||
std::cout
|
testPop();
|
||||||
<< "---------------------- Test isEmptyStack ----------------------"
|
testClear();
|
||||||
<< std::endl;
|
|
||||||
if (stk.isEmptyStack())
|
testCopyOfStackHasSameData();
|
||||||
std::cout << "PASS" << std::endl;
|
testPushingToCopyDoesNotChangeOriginal();
|
||||||
else
|
testPoppingFromCopyDoesNotChangeOriginal();
|
||||||
std::cout << "FAIL" << std::endl;
|
testPushingToOrginalDoesNotChangeCopy();
|
||||||
std::cout << "---------------------- Test push ----------------------"
|
testPoppingFromOrginalDoesNotChangeCopy();
|
||||||
<< std::endl;
|
|
||||||
std::cout << "After pushing 10 20 30 40 into stack: " << std::endl;
|
testAssign();
|
||||||
stk.push(10);
|
|
||||||
stk.push(20);
|
testTopThrowsAnvalidArgumentWhenStackEmpty();
|
||||||
stk.push(30);
|
testPopThrowsAnvalidArgumentWhenStackEmpty();
|
||||||
stk.push(40);
|
|
||||||
stk.display();
|
std::cout << "All tests pass!\n";
|
||||||
std::cout << "---------------------- Test top ----------------------"
|
|
||||||
<< std::endl;
|
|
||||||
int value = stk.top();
|
|
||||||
if (value == 40)
|
|
||||||
std::cout << "PASS" << std::endl;
|
|
||||||
else
|
|
||||||
std::cout << "FAIL" << std::endl;
|
|
||||||
std::cout << "---------------------- Test pop ----------------------"
|
|
||||||
<< std::endl;
|
|
||||||
stk.display();
|
|
||||||
stk.pop();
|
|
||||||
stk.pop();
|
|
||||||
std::cout << "After popping 2 times: " << std::endl;
|
|
||||||
stk.display();
|
|
||||||
std::cout << "---------------------- Test overload = operator "
|
|
||||||
"----------------------"
|
|
||||||
<< std::endl;
|
|
||||||
stack<int> stk1;
|
|
||||||
std::cout << "stk current: " << std::endl;
|
|
||||||
stk.display();
|
|
||||||
std::cout << std::endl << "Assign stk1 = stk " << std::endl;
|
|
||||||
stk1 = stk;
|
|
||||||
stk1.display();
|
|
||||||
std::cout << std::endl << "After pushing 8 9 10 into stk1:" << std::endl;
|
|
||||||
stk1.push(8);
|
|
||||||
stk1.push(9);
|
|
||||||
stk1.push(10);
|
|
||||||
stk1.display();
|
|
||||||
std::cout << std::endl << "stk current: " << std::endl;
|
|
||||||
stk.display();
|
|
||||||
std::cout << "Assign back stk = stk1:" << std::endl;
|
|
||||||
stk = stk1;
|
|
||||||
stk.display();
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -9,16 +9,17 @@
|
|||||||
************************************************************
|
************************************************************
|
||||||
* */
|
* */
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
#include <cmath>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "./stack.h"
|
#include "./stack.hpp"
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char* argv[]) {
|
||||||
double GPA;
|
double GPA = NAN;
|
||||||
double highestGPA;
|
double highestGPA = NAN;
|
||||||
std::string name;
|
std::string name;
|
||||||
|
|
||||||
assert(argc == 2);
|
assert(argc == 2);
|
||||||
|
Loading…
Reference in New Issue
Block a user