Skip to content

Commit b6aab34

Browse files
stack array based design
1 parent 14373b1 commit b6aab34

File tree

4 files changed

+198
-116
lines changed

4 files changed

+198
-116
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
/.vscode
88
/build
99
/cmake-build-debug
10+
/gcc_build
11+
/clang_gcc
12+
/clang_build
13+
/msvc_build
1014
/out/build/x64-Debug
1115
/Folder.DotSettings.user
1216
/twosum.h~

cormenalgo.h

Lines changed: 109 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
#ifndef CORMEN_ALGORITHM
22
#define CORMEN_ALGORITHM
3+
#include <cmath>
34
#include <iostream>
45
#include <ostream>
56
#include <vector>
6-
#include <cmath>
77
using namespace std;
88
using std::vector;
99
namespace cormen {
@@ -492,7 +492,8 @@ Number recursive_sum(const vector<Number> &ls, const size_t &ls_len) {
492492

493493
// reversing element on array by linear recursion
494494
template <typename T>
495-
void reverse_array(vector<T> &ls, const size_t &beg=0, const size_t &end=0) {
495+
void reverse_array(vector<T> &ls, const size_t &beg = 0,
496+
const size_t &end = 0) {
496497
if (ls.empty())
497498
throw std::out_of_range("calling reverse_array() on empty container");
498499
if (beg < end) {
@@ -503,80 +504,123 @@ void reverse_array(vector<T> &ls, const size_t &beg=0, const size_t &end=0) {
503504
}
504505
// binary_sum: performing binary recursion by summing all element on container
505506
template <typename Number>
506-
Number binary_sum(const vector<Number> &ls, const size_t &beg=0,
507-
const size_t &last=0)
508-
{
509-
if(last==1)
510-
return ls[beg];
511-
return binary_sum(ls,beg, floor(last/2.0)) +
512-
binary_sum(ls,beg + floor(last/2.0), ceil(last/2.0));
507+
Number binary_sum(const vector<Number> &ls, const size_t &beg = 0,
508+
const size_t &last = 0) {
509+
if (last == 1)
510+
return ls[beg];
511+
return binary_sum(ls, beg, floor(last / 2.0)) +
512+
binary_sum(ls, beg + floor(last / 2.0), ceil(last / 2.0));
513513
}
514514

515515
// binary_fib: performing binary recursion by calculate fibonacci number
516-
size_t binary_fib(const size_t &n){
517-
if(n<=1)
518-
return n; // base case
519-
return binary_fib(n-1) + binary_fib(n-2); // since F_i = f_i-1+ f_i-2
516+
size_t binary_fib(const size_t &n) {
517+
if (n <= 1)
518+
return n; // base case
519+
return binary_fib(n - 1) + binary_fib(n - 2); // since F_i = f_i-1+ f_i-2
520520
}
521521

522522
// linear_fib: performing linear recursion by calculate fibonacci number
523523
// return a pair of fibonacci number of n, and n-1
524-
std::pair<size_t,size_t> linear_fib(const size_t& n) {
525-
std::pair<size_t, size_t> result = { 0,0 };
526-
if (n <= 1)
527-
return std::make_pair(n,0);
528-
else {
529-
result = linear_fib(n-1);
530-
return { result.first + result.second, result.first };
531-
}
524+
std::pair<size_t, size_t> linear_fib(const size_t &n) {
525+
std::pair<size_t, size_t> result = {0, 0};
526+
if (n <= 1)
527+
return std::make_pair(n, 0);
528+
else {
529+
result = linear_fib(n - 1);
530+
return {result.first + result.second, result.first};
531+
}
532532
}
533533

534-
//prefix_averages(): demonstrate the running time O(n^2) by computing prefix avg
535-
template<typename Number>
536-
std::vector<double> prefix_averages(const std::vector<Number> &ls){
537-
std::vector<double> result;
538-
for(auto i=0; i<=ls.size()-1;++i){
539-
auto temp = 0.0;
540-
for(auto j=0; j<=i;++j) // 1 + 2 + 3 + .... + n = (n(n+1))/2
541-
temp += ls[j];
542-
result.push_back(temp/(i+1));
543-
}
544-
return result;
534+
// prefix_averages(): demonstrate the running time O(n^2) by computing prefix
535+
// avg
536+
template <typename Number>
537+
std::vector<double> prefix_averages(const std::vector<Number> &ls) {
538+
std::vector<double> result;
539+
for (auto i = 0; i <= ls.size() - 1; ++i) {
540+
auto temp = 0.0;
541+
for (auto j = 0; j <= i; ++j) // 1 + 2 + 3 + .... + n = (n(n+1))/2
542+
temp += ls[j];
543+
result.push_back(temp / (i + 1));
544+
}
545+
return result;
545546
}
546547

547-
//prefix_averages_lin(): demonstrate the running time O(n) by computing prefix avg
548-
template<typename Number>
549-
std::vector<double> prefix_averages_lin(const vector<Number>& ls){
550-
auto temp =0.0;
551-
vector<double> result;
552-
for(auto i=0; i<ls.size(); ++i){
553-
temp+=ls[i]; // remember the last sum, this and the next line O(n)
554-
result.push_back(temp/(i+1));
555-
}
556-
return result;
557-
}
558-
559-
//power_linear(): demonstrate the running time O(n) by computing power of x by n
560-
template<typename Number>
561-
Number power_linear(const Number &x, const size_t &n){
562-
if(n==0)
563-
return 1;
564-
return x * power_linear(x, n-1);
565-
}
566-
//power_logarithm(): demonstrate the running time O(log n) by computing power of x by n
567-
template<typename Number>
568-
Number power_logarithm(const Number &x, const size_t &n){
569-
if(n==0)
570-
return 1;
571-
if(n%2 != 0){
572-
auto y = power_logarithm(x, (n-1)/2);
573-
return x * y * y;
574-
}
575-
else{
576-
auto y = power_logarithm(x, n/2);
577-
return y * y;
578-
}
548+
// prefix_averages_lin(): demonstrate the running time O(n) by computing prefix
549+
// avg
550+
template <typename Number>
551+
std::vector<double> prefix_averages_lin(const vector<Number> &ls) {
552+
auto temp = 0.0;
553+
vector<double> result;
554+
for (auto i = 0; i < ls.size(); ++i) {
555+
temp += ls[i]; // remember the last sum, this and the next line O(n)
556+
result.push_back(temp / (i + 1));
557+
}
558+
return result;
559+
}
560+
561+
// power_linear(): demonstrate the running time O(n) by computing power of x by
562+
// n
563+
template <typename Number>
564+
Number power_linear(const Number &x, const size_t &n) {
565+
if (n == 0)
566+
return 1;
567+
return x * power_linear(x, n - 1);
568+
}
569+
// power_logarithm(): demonstrate the running time O(log n) by computing power
570+
// of x by n
571+
template <typename Number>
572+
Number power_logarithm(const Number &x, const size_t &n) {
573+
if (n == 0)
574+
return 1;
575+
if (n % 2 != 0) {
576+
auto y = power_logarithm(x, (n - 1) / 2);
577+
return x * y * y;
578+
} else {
579+
auto y = power_logarithm(x, n / 2);
580+
return y * y;
581+
}
582+
}
583+
template <typename T> class stack_array {
584+
enum { INITIAL_CAPACITY = 100 };
585+
586+
public:
587+
stack_array(const size_t &cap = INITIAL_CAPACITY);
588+
size_t size() const;
589+
bool empty() const;
590+
const T &top() const;
591+
void push(const T &);
592+
void pop();
593+
594+
private:
595+
T *s;
596+
size_t capacity;
597+
int pos;
598+
};
599+
600+
template <typename T>
601+
stack_array<T>::stack_array(const size_t &cap)
602+
: s(new T[cap]), capacity{cap}, pos{-1} {}
603+
604+
template <typename T> size_t stack_array<T>::size() const { return pos + 1; }
605+
606+
template <typename T> bool stack_array<T>::empty() const { return pos < 0; }
607+
608+
template <typename T> const T &stack_array<T>::top() const {
609+
if (empty())
610+
throw std::out_of_range("calling top() on empty stack array based");
611+
return s[pos];
612+
}
613+
614+
template <typename T> void stack_array<T>::push(const T &item) {
615+
if (size() == capacity)
616+
throw std::out_of_range("calling push() on full stack array based");
617+
s[++pos] = item;
618+
}
619+
620+
template <typename T> void stack_array<T>::pop() {
621+
if (empty())
622+
throw std::out_of_range("calling pop() on empty stack array based");
623+
--pos;
579624
}
580-
//
581625
}; // namespace cormen
582626
#endif // !CORMEN_ALGORITHM

cormentalgo_test.h

Lines changed: 84 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -429,66 +429,100 @@ TEST(recursive_reverse_array, largesample) {
429429
reverse_array(ls, 0, 99);
430430
EXPECT_EQ(des, ls);
431431
}
432-
TEST(binary_sum, sample1_integer){
433-
const vector<int> data = {0,1,2,3};
434-
EXPECT_EQ(6, binary_sum(data,0,4));
432+
TEST(binary_sum, sample1_integer) {
433+
const vector<int> data = {0, 1, 2, 3};
434+
EXPECT_EQ(6, binary_sum(data, 0, 4));
435435
}
436-
TEST(binary_sum, sample2_double){
437-
const vector<double> data = {0.1,1.1,2.1,3.1};
438-
EXPECT_EQ(6.4, binary_sum(data,0,4));
436+
TEST(binary_sum, sample2_double) {
437+
const vector<double> data = {0.1, 1.1, 2.1, 3.1};
438+
EXPECT_EQ(6.4, binary_sum(data, 0, 4));
439439
}
440-
TEST(binary_sum, non_power_two){
441-
const vector<int> data = {0,1,2,3,4};
442-
EXPECT_EQ(10, binary_sum(data,0,5));
440+
TEST(binary_sum, non_power_two) {
441+
const vector<int> data = {0, 1, 2, 3, 4};
442+
EXPECT_EQ(10, binary_sum(data, 0, 5));
443443
}
444-
TEST(binary_sum, non_power_two_double){
445-
const vector<double> data = {0.1,1.1,2.1,3.1,4.1};
446-
EXPECT_EQ(10.5, binary_sum(data,0,5));
444+
TEST(binary_sum, non_power_two_double) {
445+
const vector<double> data = {0.1, 1.1, 2.1, 3.1, 4.1};
446+
EXPECT_EQ(10.5, binary_sum(data, 0, 5));
447447
}
448-
TEST(binary_fib, base_case){
449-
EXPECT_EQ(0, binary_fib(0));
450-
EXPECT_EQ(1, binary_fib(1));
448+
TEST(binary_fib, base_case) {
449+
EXPECT_EQ(0, binary_fib(0));
450+
EXPECT_EQ(1, binary_fib(1));
451451
}
452-
TEST(binary_fib, sample1){
453-
EXPECT_EQ(1, binary_fib(2));
454-
EXPECT_EQ(2, binary_fib(3));
455-
EXPECT_EQ(3, binary_fib(4));
456-
EXPECT_EQ(5, binary_fib(5));
452+
TEST(binary_fib, sample1) {
453+
EXPECT_EQ(1, binary_fib(2));
454+
EXPECT_EQ(2, binary_fib(3));
455+
EXPECT_EQ(3, binary_fib(4));
456+
EXPECT_EQ(5, binary_fib(5));
457457
}
458458
TEST(linear_fib, basecase) {
459-
std::pair<size_t, size_t> dest = make_pair(1, 0);
460-
EXPECT_EQ(dest, linear_fib(1));
459+
std::pair<size_t, size_t> dest = make_pair(1, 0);
460+
EXPECT_EQ(dest, linear_fib(1));
461461
}
462-
TEST(linear_fib, fib3){
463-
std::pair<size_t, size_t> dest = make_pair(2, 1);
464-
EXPECT_EQ(dest, linear_fib(3));
462+
TEST(linear_fib, fib3) {
463+
std::pair<size_t, size_t> dest = make_pair(2, 1);
464+
EXPECT_EQ(dest, linear_fib(3));
465465
}
466-
TEST(linear_fib, fib6){
467-
std::pair<size_t, size_t> dest = make_pair(8, 5);
468-
EXPECT_EQ(dest, linear_fib(6));
466+
TEST(linear_fib, fib6) {
467+
std::pair<size_t, size_t> dest = make_pair(8, 5);
468+
EXPECT_EQ(dest, linear_fib(6));
469469
}
470470
TEST(linear_fib, fib7) {
471-
std::pair<size_t, size_t> dest = make_pair(13, 8);
472-
EXPECT_EQ(dest, linear_fib(7));
473-
}
474-
TEST(prefix_averages, case1){
475-
vector<int> data = {1,2,3};
476-
EXPECT_EQ(vector({1.0,1.5,2.0}), prefix_averages(data));
477-
}
478-
TEST(prefix_averages_lin, case1){
479-
vector<int> data = {1,2,3};
480-
EXPECT_EQ(vector({1.0,1.5,2.0}), prefix_averages_lin(data));
481-
}
482-
TEST(power_linear, case1){
483-
EXPECT_EQ(8, power_linear(2,3));
484-
}
485-
TEST(power_linear, case2){
486-
EXPECT_EQ(125, power_linear(5,3));
487-
}
488-
TEST(power_logarithm, case1){
489-
EXPECT_EQ(8, power_logarithm(2,3));
490-
}
491-
TEST(power_logarithm, case2){
492-
EXPECT_EQ(125, power_logarithm(5,3));
471+
std::pair<size_t, size_t> dest = make_pair(13, 8);
472+
EXPECT_EQ(dest, linear_fib(7));
473+
}
474+
TEST(prefix_averages, case1) {
475+
vector<int> data = {1, 2, 3};
476+
EXPECT_EQ(vector({1.0, 1.5, 2.0}), prefix_averages(data));
477+
}
478+
TEST(prefix_averages_lin, case1) {
479+
vector<int> data = {1, 2, 3};
480+
EXPECT_EQ(vector({1.0, 1.5, 2.0}), prefix_averages_lin(data));
481+
}
482+
TEST(power_linear, case1) { EXPECT_EQ(8, power_linear(2, 3)); }
483+
TEST(power_linear, case2) { EXPECT_EQ(125, power_linear(5, 3)); }
484+
TEST(power_logarithm, case1) { EXPECT_EQ(8, power_logarithm(2, 3)); }
485+
TEST(power_logarithm, case2) { EXPECT_EQ(125, power_logarithm(5, 3)); }
486+
TEST(stack_array, calling_push) {
487+
stack_array<int> data;
488+
data.push(12);
489+
EXPECT_EQ(12, data.top());
490+
}
491+
TEST(stack_array, calling_push_onfull) {
492+
stack_array<int> data(1);
493+
data.push(13);
494+
EXPECT_ANY_THROW(data.push(34));
495+
}
496+
TEST(stack_array, calling_pop) {
497+
stack_array<double> data;
498+
data.push(45.6);
499+
EXPECT_FALSE(data.empty());
500+
data.pop();
501+
EXPECT_TRUE(data.empty());
502+
}
503+
TEST(stack_array, calling_pop_empty) {
504+
stack_array<double> data;
505+
EXPECT_ANY_THROW(data.pop());
506+
}
507+
TEST(stack_array, calling_size) {
508+
stack_array<double> data;
509+
EXPECT_EQ(0, data.size());
510+
data.push(23.2);
511+
;
512+
EXPECT_EQ(1, data.size());
513+
}
514+
TEST(stack_array, calling_empty) {
515+
stack_array<int> data;
516+
EXPECT_TRUE(data.empty());
517+
}
518+
TEST(stack_array, calling_top) {
519+
stack_array<std::string> data;
520+
data.push(string("michael"));
521+
data.push(string("jack"));
522+
EXPECT_EQ(string("jack"), data.top());
523+
}
524+
TEST(stack_array, calling_top_onempty) {
525+
stack_array<std::string> data;
526+
EXPECT_ANY_THROW(data.top());
493527
}
494528
#endif

secondchal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77
#include <fmt/ranges.h>
88
#include <iostream>
99
#include <limits>
10+
#include <list>
1011
#include <numeric>
1112
#include <set>
1213
#include <string>
1314
#include <vector>
14-
#include <list>
1515
using namespace fmt;
1616
using namespace std;
1717

0 commit comments

Comments
 (0)