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>
204 lines
5.2 KiB
C++
204 lines
5.2 KiB
C++
#include <cassert> /// for assert
|
|
#include <iostream> /// for std::cout
|
|
#include <stdexcept> /// std::invalid_argument
|
|
#include <vector> /// for std::vector
|
|
|
|
#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() {
|
|
testConstructedStackIsEmpty<int>();
|
|
testConstructedStackIsEmpty<char>();
|
|
|
|
testPush();
|
|
testPop();
|
|
testClear();
|
|
|
|
testCopyOfStackHasSameData();
|
|
testPushingToCopyDoesNotChangeOriginal();
|
|
testPoppingFromCopyDoesNotChangeOriginal();
|
|
testPushingToOrginalDoesNotChangeCopy();
|
|
testPoppingFromOrginalDoesNotChangeCopy();
|
|
|
|
testAssign();
|
|
|
|
testTopThrowsAnvalidArgumentWhenStackEmpty();
|
|
testPopThrowsAnvalidArgumentWhenStackEmpty();
|
|
|
|
std::cout << "All tests pass!\n";
|
|
return 0;
|
|
}
|